シェルはターミナル内で動作するアプリケーションです。
POSIXにおいてsh
として定義されていますが、現在はbash
が広く流行し、デフォルトとして使用されます。
しかしそのほかにも
ksh
やcsh
など様々なシェルが開発されています。
ストリーム
ストリームには入力ストリームと出力ストリームがあり、 この二つを組み合わせて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
で失敗した旨を伝えている。