
Linuxのコマンドライン(CUI)を使っていると、コマンドの実行結果をファイルに保存したり、逆にファイルの内容をコマンドに渡したりしたい場面がよくあります。また、正常な出力とエラーメッセージを分けて扱いたい、あるいはまとめて記録したい、という要求も出てきます。
これらを実現するのが「リダイレクション」という機能です。リダイレクションを理解すると、コマンドラインでの作業効率が格段に向上し、スクリプト作成などでも非常に役立ちます。
今回は、Linuxの基本的な入出力の仕組み(標準ストリーム)から、リダイレクションの様々な使い方まで、初心者の方にも分かりやすく解説していきます。
もしLinuxの基本コマンドを確認したい場合はこちらにブログ記載しておりますのでご確認ください。
コマンドはどこから入力され、どこへ出力される? ~標準ストリーム~
Linuxのコマンド(プログラム)は、通常、以下の3つの「通り道」を使ってデータのやり取りを行います。これらは「標準ストリーム」と呼ばれ、特に指定しなければ、あらかじめ決められた場所に接続されています。
- 標準入力 (stdin): コマンドがデータを受け取るための入力元です。通常はキーボードに接続されており、ユーザーがキーボードから入力した内容がコマンドに渡されます。例えば、
cat
コマンドを引数なしで実行すると、キーボードからの入力を待ちます。 - 標準出力 (stdout): コマンドが正常な実行結果を出力する先です。通常は端末(ターミナル画面)に接続されており、コマンドの実行結果が画面に表示されます。例えば、
ls
コマンドを実行すると、ファイル一覧が画面に表示されます。 - 標準エラー出力 (stderr): コマンドがエラーメッセージや警告などを出力する先です。これも通常は端末(ターミナル画面)に接続されています。標準出力とは別の経路なので、エラーだけを画面に表示したり、正常な出力と区別したりすることができます。例えば、存在しないファイル名を指定して
cat
コマンドを実行すると、「No such file or directory」といったエラーメッセージが画面に出力されます。
内部的には、これらの標準ストリームはファイルディスクリプタ (File Descriptor) と呼ばれる番号で管理されており、標準入力は 0
、標準出力は 1
、標準エラー出力は 2
という番号が割り当てられています。この番号は、後述するリダイレクションで重要な役割を果たします。
リダイレクション:入出力の流れを変える
リダイレクションは、これらの標準ストリームの接続先を、デフォルトのキーボードや端末から、ファイルなどに変更する機能です。特殊な記号を使って指定します。
基本的なリダイレクション (<, >, >>)
- 入力リダイレクション (
<
): 標準入力の変更command < file
コマンドの標準入力(stdin, 0番)を、キーボードから指定したfile
に切り替えます。ファイルの内容がコマンドへの入力となります。- 例:
sort < data.txt
(data.txtの内容をsortコマンドに入力して並び替える)
- 例:
- 出力リダイレクション (
>
): 標準出力の変更(上書き)command > file
コマンドの標準出力(stdout, 1番)を、端末から指定したfile
に切り替えます。コマンドの実行結果がファイルに書き込まれます。- 注意点: 指定したファイルが既に存在する場合、その内容は上書きされます。ファイルが存在しない場合は、新しく作成されます。大切なファイルを誤って上書きしないように注意しましょう。
- 例:
ls -l > file_list.txt
(ls -lの結果をfile_list.txtに保存する)
- 出力リダイレクション (
>>
): 標準出力の変更(追記)command >> file
コマンドの標準出力(stdout, 1番)を指定したfile
の末尾に追加します。>
と異なり、既存の内容は消えません。- 注意点: ファイルが存在しない場合は、新しく作成されます。
- 例:
date >> activity.log
(現在の時刻をactivity.logの末尾に追記する)
エラー出力の制御 (2>, 2>>, 2>&1)
コマンドのエラーメッセージ(標準エラー出力)だけをファイルに保存したり、正常な出力とエラー出力を一緒に扱ったりすることも可能です。ここでファイルディスクリプタの番号 (2
) が登場します。
- エラー出力リダイレクション (
2>
): 標準エラー出力の変更(上書き)command 2> error_log.txt
コマンドの標準エラー出力(stderr, 2番)を、端末から指定したerror_log.txt
に切り替えます。エラーメッセージだけがファイルに保存され、標準出力(正常な結果)は端末に表示されます。ファイルが存在すれば上書きされます。- 例:
find / -name "secret" 2> find_errors.log
(ファイル検索中のエラーだけを記録)
- 例:
- エラー出力リダイレクション (
2>>
): 標準エラー出力の変更(追記)command 2>> error_log.txt
コマンドの標準エラー出力(stderr, 2番)を指定したerror_log.txt
の末尾に追加します。- 例:
my_script.sh 2>> script_errors.log
(スクリプト実行時のエラーを追記で記録)
- 例:
- エラー出力を標準出力と同じ場所へ (
2>&1
)command 2>&1
これは少し特殊ですが非常に重要です。「ファイルディスクリプタ2番(stderr)の出力先を、ファイルディスクリプタ1番(stdout)が現在指している場所と同じにする」という意味です。この&1
は「ファイル名’1’」ではなく、「ファイルディスクリプタ1番」を指します。これにより、エラー出力も標準出力と同じ経路で扱われるようになります。
標準出力とエラー出力をまとめる
コマンドの実行結果(正常な出力)とエラーメッセージの両方を、一つのファイルにまとめて保存したい場合によく使われます。
- 両方をファイルへ(上書き) (
> file 2>&1
)command > output.log 2>&1
この書き方では、まず>
によって標準出力(1番)の行き先がoutput.log
に変更されます。その後、2>&1
によって標準エラー出力(2番)の行き先が「標準出力が今向いている場所」、つまりoutput.log
に変更されます。結果として、標準出力と標準エラー出力の両方がoutput.log
に上書き保存されます。記述する順番が重要です。- 例:
backup.sh > backup_run.log 2>&1
(バックアップスクリプトの全出力をログへ)
- 例:
- 両方をファイルへ(上書き、短縮形) (
&>
または>&
)command &> output.log
上記> output.log 2>&1
と同じ意味を持つ、より簡単な書き方です(シェルによっては>&
の場合もあります)。標準出力と標準エラー出力の両方を指定ファイルに上書きします。- 例:
compile_program &> compile.log
- 例:
- 両方をファイルへ(追記、短縮形) (
&>>
)command &>> output.log
標準出力と標準エラー出力の両方を、指定したファイルの末尾に追記する簡単な書き方です。- 例:
long_running_process &>> process.log
- 例:
command 2>&1 > file
のように順番を変えると、「まずエラー出力を現在の標準出力(通常は端末)に向け、その後で標準出力をファイルに向ける」という意味になり、エラーは端末に、正常出力はファイルに、と別々に出力されるため、意図した結果と異なる場合があります。
コマンドへ直接入力する
ファイルを用意するまでもない短い入力や、スクリプト内で複数行の入力をコマンドに渡したい場合に便利です。
- ヒアストリング (
<<<
)command <<< "入力文字列"
"入力文字列"
という単一の文字列を、コマンドの標準入力として渡します。 例:wc -c <<< "Hello World"
(“Hello World”の文字数をカウント) - ヒアドキュメント (
<< デリミタ
)command << EOF
1行目の入力
2行目の入力
...
EOF
<<
に続けて任意の区切り文字(EOF
がよく使われるが、他の単語でも可)を指定し、次の行から複数行の入力を記述します。最後に、行頭から区切り文字だけを記述した行が現れると、そこまでの内容がコマンドの標準入力として渡されます。 例:cat << END_TEXT これは1行目です。 これは2行目です。 END_TEXT
(上記を実行すると、2行のテキストがcat
コマンドに渡されて表示される)
まとめ
Linuxのリダイレクションは、コマンドの入出力先を柔軟に変更するための強力な機能です。
<
: ファイルから入力>
: ファイルへ出力(上書き)>>
: ファイルへ出力(追記)2>
: エラーをファイルへ(上書き)2>>
: エラーをファイルへ(追記)2>&1
: エラーを標準出力と同じ場所へ&>
/&>>
: 標準出力とエラーの両方をファイルへ(上書き/追記)<<<
: 文字列をコマンドへ入力<< EOF
: 複数行をコマンドへ入力
これらの記号の意味と使い方を理解すれば、ログの取得、データの加工、スクリプトの作成など、Linux環境での様々な作業がより効率的かつ自動化しやすくなります。まずは簡単なコマンドと組み合わせて、実際に試してみてください。
最後までお読みいただき、ありがとうございました。
コメント