Linuxのストリームの基本【stdoutとstdin】

シェルはターミナル内で動作するアプリケーションです。 POSIXにおいてshとして定義されていますが、現在はbashが広く流行し、デフォルトとして使用されます。

しかしそのほかにも kshcshなど様々なシェルが開発されています。

ストリーム

ストリームには入力ストリームと出力ストリームがあり、 この二つを組み合わせてi/oと呼びます。

基本的にすべてのシェルはすべてのプロセスに対して3つのファイルディスクリプタを用意しております。 ファイルディスクリプタとは、プログラムからファイルを操作する際、操作対象のファイルを識別・同定するために割り当てられる番号です。

  • stdin : FDは0
  • stdout : FDは1
  • stderr : FDは2

そしてこれらのファイルディスクリプタは、デフォルトではそれぞれキーボードとスクリーンに接続されています。

を繋げることで行数を数えることができる。stdoutとstdin

stdoutディスクリプタは特に何も指定しなければスクリーンに接続されています。 したがって、 以下の実行結果はスクリーンに表示されるのです。

curl https://example.com

ところが、スクリーンに表示されるはずの出力結果をファイルに保存するやり方があります。 コマンドを入力したのちに1> + [ファイル名]を入力することで、実行結果をファイルに移すことができるのです。

curl https://example.com 1> test.file

ちなみに、

  • 標準出力は1>
  • エラー出力は2>

とエラー出力と実行結果の出力は明確に分けられており、この二つは以下のように分けることができます。

curl https://example.com 1> /tmp/content.txt 2> /tmp/curl-status

dev/nullとは何か?

ちなみにlinuxには/dev/nullという特別なファイルが存在しており、 ここにファイルディスクリプタをリダイレクトすると内容が棄却されます。(ファイル内に保存されもしないし、どこにも残らない)

cur https://example.com 1> /dev/null

アンパサンド

コマンドの最後に置くとバックグラウンド実行が可能

cur https://example.com &

バックスラッシュ

長いコマンドの改行が可能

cur https://example.com /
    1> result.txt

パイプ

前方のコマンドによるプロセスのstdoutと後方のコマンドによるプロセスのstdinを繋げることが可能。

curl https://example.com > wc -l

この場合は、curlのstdoutとwc -lのstdinを繋げることで行数を数えることができる。

そのほかの小技

catはファイルの内容を出力するコマンドだが、引数が何もなければキーボードからの入力を表示するコマンドになる。 つまり、以下のようにしてメモを残すことが可能。

cat > memo.md

終了ステータス

シェル上で入力されるコマンドが終了したとき、終了ステータスが発行されます。

  • 0 : 正常終了
  • 1~255 : 異常終了

終了ステータスは$?に格納されており、次のようにechoコマンドを使用することで確認できます。

echo $?

終了ステータスにより処理の分岐をしたい場合、$$||が使える。

$$一つ目のコマンドが成功したら実行する。

$$は一つ目のコマンドが成功したらという条件で二つ目のコマンドを実行する

git add . && git commit -m "save"

この場合、git add .が成功した場合に限り、のちのgit commit ...コマンドを実行する。

この$$はANDという意味で覚えておくとよい

||一つ目のコマンドが失敗したら実行する。

||は一つ目のコマンドが失敗したらという条件で二つ目のコマンドを実行する

nginx start || echo "command faild."

この場合、nginx startに失敗した場合にechoで失敗した旨を伝えている。