皆さんこんにちは。今日はLinuxの標準入力、標準出力、標準エラー、リダイレクト、パイプラインなど、コマンドのインプット・アウトプットの操作について理解を深めていきます。
AWSのEC2インスタンスに接続できていることを前提として解説していくので、「Linuxの基礎コマンド」について学習がまだの方は先にそちらを学習してから本記事に戻ってきてください。

Linuxの標準入力、標準出力、標準エラー
標準入力とは、同コンソール(ターミナル)からのキーボード入力のことを指します。以下の例ではキーボードから ls コマンドを入力して実行しています。
[ec2-user@www test]$ ls -l
標準出力とは、意図した正常な出力結果を同コンソールへ表示出力することを指します。以下の例では、標準入力から入力された ls コマンドの出力結果が同コンソールに表示されています。
[ec2-user@www test]$ ls -l
total 4
-rw-rw-r-- 1 ec2-user ec2-user 6 Mar 2 04:26 test1.txt
標準エラーとは、コマンド指定のミス等による意図しないエラーメッセージを同コンソールに出力することを指します。以下の例では、存在しないコマンドを実行した場合のエラーが同コンソールに表示されています。
[ec2-user@www test]$ no-command
-bash: no-command: command not found
ファイルディスクリプター
ファイルディスクリプターとは、Linuxのプロセスから割り当てられる入出力の先のことで、前述の標準入力・出力・エラーそれぞれにデフォルトの数値が割り当てられています。
- 0:標準入力(standard input)
- 1:標準出力(standard output)
- 2:標準エラー(standard error)
入出力のリダイレクト
入出力はコンソールからだけではなく、ファイルの内容をコマンドの入力データとしたり、逆にコマンドの結果をファイルに出力したりすることができます。これをリダイレクトといいます。リダイレクトは、コマンド実行時に前述のファイルディスクリプターの数値を指定することでなされます。
また、リダイレクトはその方向性によって「<」や「>」の記号を使用します。
- <:入力のリダイレクト
- >:出力のリダイレクト
次の項目でファイルディスクリプタとリダイレクトの方向性を同時に使用した使い方を説明していきます。
入力のリダイレクト
入力のリダイレクト場合は各コマンドの入力箇所にファイルディスクリプタ「0」とリダイレクトの方向性「<」を同時に指定します。以下の例では、test.txtに「こんにちは」と記述されていた場合、catコマンドにtest.txtのファイルの内容を渡し、その内容を標準出力に表示することになります。
標準入力のディスクリプターの0は省略可能です。通常は省略して使用します。
以下のコマンドの実行結果は同じになります。
[ec2-user@www test]$ cat 0< test.txt
こんにちは
[ec2-user@www test]$ cat < test.txt
こんにちは
ヒアドキュメント(Here Document)
ヒアドキュメントとは、入力リダイレクトで使われる特別なコードブロックで物理ファイルと同じ扱いになります。コンソールだけでなくスクリプト内でもコマンドの入力して使用することもできます。
構文は以下の通り。
コマンド <<EOF
1行目
2行目
3行目
...
EOF
EOFは終了ラベルと言って、入力の終了を表すものになります。通常はEOF(End Of)が使用されますが、必ずしもEOFの文字列でなくても構いません。
以下の構文の場合は先頭のタブが無視されるのでタブインデントが適用できて可読性が上がります。
コマンド <<-EOF
1行目
2行目
3行目
...
EOF
以下の例ではヒアドキュメントの入力をファイルとして cat コマンドに渡して、cat のコマンド出力をoutput.txtファイルに出力しています。
[ec2-user@www test]$ cat > output.txt << EOF
> line1
> line2
> line3
> EOF
[ec2-user@www test]$ cat output.txt
line1
line2
line3
以下の例では、ヒアドキュメントの入力をファイルとして sortコマンド(並べ替えコマンド)に渡して、sortコマンドの出力を標準出力で同コンソールに出力しています。
[ec2-user@www test]$ sort <<EOF
> line3
> line2
> line1
> EOF
line1
line2
line3
出力のリダイレクト
出力のリダイレクトの場合は各コマンドの末尾にファイルディスクリプタ「1」とリダイレクトの方向性「>」を同時に指定します。次の例では、test.txtに「こんにちは」と記述されていた場合、catコマンドがtest.txtのファイルの内容を読み取りますが、その内容は標準出力のコンソールには表示されず、output.txtに出力されています。
標準出力のディスクリプターの 1 は省略可能です。通常は省略して使用します。
以下のコマンドの実行結果は同じになります。
[ec2-user@www test]$ cat test.txt 1> output.txt
[ec2-user@www test]$ cat output.txt
こんにちは
[ec2-user@www test]$ cat test.txt > output.txt
[ec2-user@www test]$ cat output.txt
こんにちは
リダイレクトによるファイルの上書きと追記
「>」はファイルの上書きを意味しますので、意図しないファイル内容の削除に注意が必要です。
echo "hello world" > test .txt
「>>」はファイルへの追記を意味します。ログ出力などの自動的なファイルの追記の場合はファイル容量の肥大化に注意が必要です。
echo "hello world" >> test .txt
入力リダイレクトと出力リダイレクトの同時使用
入力リダイレクトと出力リダイレクトを同時に使用することも可能です。以下の例では、input.txtファイルの中身をsortコマンドに渡して、アルファベット順に並び替えた出力結果をsorted.txtファイルに出力しています。
sort < input.txt > sorted.txt
入力ファイル名と出力ファイル名が同じ場合はファイルが上書きされてしまうので注意が必要です。
標準エラーのリダイレクト
標準エラーも個別のファイルに出力することができます。
no-command 2> error.txt
標準出力と標準エラーを別々のファイルにリダイレクト
標準出力のリダイレクトが行われていても標準エラーが明示的に指定されていない場合、エラーが発生した場合は同コンソールにエラー出力が表示されます。以下の例ではそれぞれコマンド結果を標準出力と標準エラーを別々のファイルに分けて出力しています。
存在しないディレクトリなのでエラー内容はerror.txtに出力され、標準出力は何もないがtext.txtファイルは空ファイルとして作成される。
ls -l /no/such/directory > result.txt 2> error.txt
存在するディレクトリでコマンドは成功するので、コマンドの出力結果がresult.txt内に作成され、エラーメッセージはないので空のerror.txtファイルが作成される。
ls -l /home/ec2-user > result.txt 2> error.txt
標準エラーを標準出力と同じファイルにリダイレクト
標準エラーのリダイレクト先を標準出力と同じにする場合は「2>&1」をコマンド末尾に付けます。
ls -l /home/ec2-user > output.txt 2>&1
出力を無しにする
標準出力も標準エラー出力も表示したくない場合はリダイレクト先に /dev/null を指定します。
【コマンドが正常衆力する場合】
[ec2-user@www test]$ echo "こんにちは" 2> /dev/null
こんにちは
【コマンドタイプミスでエラーが発生してもどこにも何も出力されない】
[ec2-user@www test]$ echoo "こんにちは" 2> /dev/null
[ec2-user@www test]$
/dev/null ディレクトリはLinuxシステム内でも出力をなくす特殊なディレクトリです。
パイプラインの使い方
パイプラインとはコマンドの出力結果を次のコマンドの入力することで、コマンドの出力結果を次々と渡していくことをパイピングと言います。コマンドの連結には縦棒のパイプ(|)キーを使います。検索、フォーマット、並べ替えなどの処理を順番に行う事ができます。
構文は以下の通り。
コマンド1|コマンド2|コマンド3|...
パイプラインの使用例
【.mp4ファイルを探して、その中からbirthdayという文字列を含むものを探し、アルファベット順に並び替えて表示する】
find -type f -name '*.mp4' | grep birthday | sort
【プロセスの中からdefunをいう文字列を含むものを表示する】
ps -ef | grep defun
【パッケージリストからhttpdという文字列を含むものを表示する】
dnf list | grep httpd
まとめ
今回の記事では、Linuxの標準入力、標準出力、標準エラー、ダイレクト、パイプの5つについて学習をしました。ファイルディスクリプターの数字(0、1、2)とリダイレクト記号(<、>)を使ってコマンドへの入出力にファイルを使用しました。そして、エラー出力も別々または同じファイルに出力もできましたね。更に、コンソールからの入力にはヒアドキュメントというものをありました。最後にはコマンドの出力結果を次のコマンドに渡すパイプラインについても学習しました。今回のLinuxの知識も今後の大きな武器となるでしょう。