リダイレクト(>
, >>
, <
)やパイプライン(|
)に関するストリーム処理は、Unix系シェル(bash など)での標準的な入力・出力の操作に関わる重要な概念です
唐突な記号の登場により、毎年新人が躓きやすい箇所でもあるので以下にそれぞれの機能をまとめて整理してみます
🚤 ストリームの基本
ストリームは、処理の流れを表す概念です
シェルには、以下の3つのストリームがあります:
ストリーム | 番号 | 意味 |
---|---|---|
標準入力 | 0 |
キーボード等の入力 |
標準出力 | 1 |
通常の出力 |
標準エラー | 2 |
エラー出力 |
↪️ リダイレクト
リダイレクトは、標準の出力先(ターミナル画面)や入力元(キーボード)を変更します:
標準出力のリダイレクト
出力が、ターミナルには表示されず代わりにファイル等へ書き込まれます
>
:上書き(ファイルがあれば削除して書き込む)
echo "Hello" > file.txt
>>
:追記
echo "World" >> file.txt
標準入力のリダイレクト
入力を、キーボード入力に代わりファイル等から読み込みます
<
:ファイルからの入力
wc -l < file.txt
<<
:指定文字(ここでは"EOF")までの文字列の入力
grep apple <<EOF
apple
lemon
pineapple
EOF
標準エラーのリダイレクト
2>
:エラーをファイルに出力
ls kyomu 2> error.log
2>&1
:エラー出力を標準出力と同じ場所へ出力
command > out.log 2>&1
🔗 パイプライン(|
)
パイプは、コマンドの「標準出力」を、次のコマンドの「標準入力」として渡します:
ls -l | grep ".txt"
上記は、ls -l
の結果から .txt
を含む行だけを抽出します
複数のパイプも可能です:
cat file.txt | grep "error" | sort | uniq
🖇️ tee
コマンド
tee
コマンドは、出力を指定(複数でも可)のファイル等に保存しつつ標準出力にも流します:
ls -l | tee all.txt
🧩 xargs
コマンド
xargs
コマンドは、出力(複数でも可)を次のコマンドの引数に指定します:
ls -l | grep ".ai" | xargs rm -i