Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Linuxターミナルのリダイレクトを使いこなして、データの読み書きを自由自在に

入出力のリダイレクトは、あらゆるプログラミング言語やスクリプト言語が備える基本的な機能です。技術的に言えば、コンピュータとやり取りをする限り、常に無意識のうちに発生しています。入力は stdin(標準入力、通常はキーボード)から読み込まれ、出力は stdout(標準出力、テキストやデータのストリーム)へ送られ、エラーは stderr に出力されます。これらのデータストリームの存在を理解すれば、BashやZshなどのシェルを使う際に、情報の行き先を思いどおりに制御できるようになります。

標準入力・標準出力・標準エラーは、Linux上ではファイルシステムの場所として存在しています。/dev ディレクトリで確認できます:

$ ls /dev/std*
/dev/stderr@ /dev/stdin@ /dev/stdout@

直接これらを操作することはあまりありませんが、データを送り込める「メタ的な場所」として捉えておくと便利です。

リダイレクトの基本はシンプルです。出力のリダイレクトには > 記号を、入力のリダイレクトには < 記号を使用します。

出力のリダイレクト

lsコマンドの出力をファイルに書き込むには、次のようにします:

$ ls > list.txt

通常なら画面に表示されるはずの ls の出力が表示されないのは、出力が画面ではなく list.txt ファイルに書き込まれているためです。この機能は非常に汎用性が高く、あるファイルの中身を別のファイルにコピーすることにも使えます。テキストファイルである必要はなく、バイナリデータにも利用できます:

$ cat image.png > picture.png

(なぜそんなことをしたいのか不思議に思うかもしれませんが、ファイルのパーミッションに影響を与えたい場合などに意外と役立つテクニックです。)

入力のリダイレクト

コマンドに入力をリダイレクトすることもできます。多くのコマンドは引数から入力を受け取るように作られているため、出力のリダイレクトほど頻繁には使わないかもしれません。しかし、コマンドが引数のリストを期待していて、そのリストがすでにファイルに保存されている場合、手動でコピーアンドペーストせずに済むので便利です:

$ sudo dnf install $(<package.list)

入力リダイレクトの代表的な使い方としては、ヒアドキュメント(here-document)ヒアストリング(here-string)があります。ヒアドキュメントは、特別な終端マーカー(多くの人は EOF を使いますが、一意であれば任意の文字列で構いません)までのテキストブロックを標準入力ストリームに流し込みます。ターミナルで次のように入力してみてください(2つ目の EOF まで):

$ echo << EOF
> foo
> bar
> baz
> EOF

期待される結果:

foo
bar
baz

ヒアドキュメントは、複数行のテキストをファイルや画面に出力したいときに、Bashスクリプト作者がよく使う定番テクニックです。終端マーカーで閉じることを忘れさえしなければ、echoprintf の羅列を避ける効果的な方法になります。

ヒアストリングはヒアドキュメントに似ていますが、単一の文字列(または引用符で囲んで1つの文字列に見せた複数の文字列)だけを扱います:

$ cat <<< "foo bar baz"
foo bar baz

エラーメッセージのリダイレクト

エラーメッセージは stderr と呼ばれるストリームに出力され、リダイレクトでは 2> として指定します。次のコマンドは、エラーメッセージを output.log ファイルに振り向けます:

$ ls /nope 2> output.log

/dev/null へデータを送る

標準入力・標準出力・標準エラーにそれぞれ場所があるように、Linuxのファイルシステムには「どこでもない」場所も存在します。それが null で、/dev ディレクトリ内にあるため、頻繁に使う人は「スラッシュデブスラッシュヌル」と呼ぶのが面倒になり、「デブヌル(devnull)」と発音しがちです。

リダイレクトを使えば、データを /dev/null に送れます。たとえば find コマンドは出力が冗長になりがちで、ファイルを検索する際にパーミッションの問題をしばしば報告します:

$ find ~ -type f 
/home/seth/actual.file
find: `/home/seth/foggy': Permission denied
find: `/home/seth/groggy': Permission denied
find: `/home/seth/soggy': Permission denied
/home/seth/zzz.file

find コマンドはこれらをエラーとして処理するので、エラーメッセージだけを /dev/null にリダイレクトできます:

$ find ~ -type f 2> /dev/null
/home/seth/actual.file
/home/seth/zzz.file

リダイレクトを活用しよう

リダイレクトは、Bashでデータをある場所から別の場所へ効率的に移動させる手段です。常時使うものではないかもしれませんが、必要なときに使いこなせるようになれば、ファイルを開いて中身をコピー&ペーストするといった、マウス操作や大量のキー入力を伴う無駄な作業を大幅に省けます。そんな遠回りはやめて、リダイレクトで快適なLinuxライフを実現しましょう。

  1. Linuxターミナルからメールを送信する4つの方法(mail・sendmail・telnet・mutt)

    Linuxのターミナルは、わずかなキー操作だけで多彩なタスクを実行できる強力な環境です。日頃からターミナルで作業することが多い方なら、メールもターミナルから直接送信できることをご存じでしょうか。本記事では、Linuxターミナルからメールを送信するための代表的な4つの方法とツールを、具体的なコマンド例とともにわかりやすく解説します。 注意:ターミナルからメールを送信するには、あらかじめメールサーバーがセットアップされ、正常に動作している必要があります。 1. mailコマンドを使う Linuxターミナルからメールを送信する最もシンプルな方法が、mailユーティリティの利用です。宛先や件名を指定

  2. Linuxターミナルだけでアプリのアイコンを変更する方法

    以前、GNOME 3のGUI操作でアプリケーションのアイコンを簡単に変更する方法をご紹介しました。しかし、中には「やっぱりターミナルで作業したい」というユーザーもいます。もちろんターミナルからでもアイコンの変更は可能ですが、マウスを数回クリックするのに比べると、ひと手間かかるのが実情です。この記事では、ターミナルから直接アプリケーションのアイコンを変更する手順を、順を追って解説します。 アプリのデスクトップ設定ファイル(.desktop)を見つける デスクトップに表示される各アプリケーションには、それぞれ「.desktop」という拡張子の設定ファイルが用意されています。これはテキスト形式