リダイレクトについてメモってく
zsh 5.5.1
とにもかくにもこいつがでてくる
ファイル記述子(ファイルディスクリプタ)とは。 下記抜粋
→プログラムがアクセスするファイルや標準入出力などをOSが識別するために用いる識別子。 0から順番に整数の値が割り当てられる。
プログラミングにおいてファイルへの参照を抽象化したキーである。
コマンドの入出力の分類は下記のとおり ※括弧内はデフォの入出力先
- 標準入力:コマンドに渡す入力(キーボードから入力した文字列)
- 標準出力:コマンド成功時の出力 ( 画面)
- 標準エラー出力:エラー時の出力 (画面)
入出力にはOSが識別するために 番号が振られてる。 それがファイル記述子?
番号 | 出力先 |
---|---|
0 | 標準入力(stdin) |
1 | 標準出力(stdout) |
2 | 標準エラー出力(stderr) |
n | 任意の入出力先 |
[N] はファイル記述子→ 省略可。 デフォルトは 入力の場合 0:標準入力
、 出力の場合1:標準出力
- Fileの内容を N で読み込める。
- 多分一番使ってるやつ
- ファイルが存在しなかった場合は新規作成
command > File
はcommand 1> File
の省略形だったというわけだ
>
と同じだけど追記モード
- 標準出力(ファイル記述子1)と標準エラー出力(ファイル記述子2)の両方を Fileに書き出す
- ファイル記述子の複製(出力)とごっちゃになって混乱するので
&> File
で覚えるほうがよさそう
- 標準出力(ファイル記述子1)と標準エラー出力(ファイル記述子2)の両方を Fileに 追記モードで書き出す
- ファイル記述子N1(入力)に ファイル記述子N2を複写する
- ファイル記述子N1(出力)にファイル記述子N2をを複写する
- よく見る
2>&1
は 標準エラー出力(stderr)に標準出力(stdout)を複写してるてこと
こんなファイル用意する
echo "stdout" >&1
echo "stderr" >&2
$ bash redirect.sh &> /dev/null
$ bash redirect.sh > /dev/null 2>&1
$ bash redirect.sh 2> error.txt
stdout
$ cat error.txt
stderr
# こんなファイルがある
$ ls
hoge
$ cat hoge
(´・_・`)
## <hogeでファイル出力
$ <hoge
(´・_・`)
## <hoge>foo でhogeを複製できたり
$ <hoge>foo
$ ls
foo hoge
$ <foo
(´・_・`)
- リダイレクトは記載した順番、左から右へと順番にファイル・ディスクリプターの参照を更新していく。