Skip to content

Instantly share code, notes, and snippets.

@sho-t
Last active November 29, 2018 03:03
Show Gist options
  • Save sho-t/c6a9edb5a9a75238983845068b1b010b to your computer and use it in GitHub Desktop.
Save sho-t/c6a9edb5a9a75238983845068b1b010b to your computer and use it in GitHub Desktop.
shellのリダイレクトメモ

shell リダイレクトのメモ

リダイレクトについてメモってく

環境

zsh 5.5.1

ファイル記述子(ファイルディスクリプタ)

とにもかくにもこいつがでてくる
ファイル記述子(ファイルディスクリプタ)とは。 下記抜粋

→プログラムがアクセスするファイルや標準入出力などをOSが識別するために用いる識別子。 0から順番に整数の値が割り当てられる。

プログラミングにおいてファイルへの参照を抽象化したキーである。

コマンドの入出力の分類は下記のとおり ※括弧内はデフォの入出力先

  • 標準入力:コマンドに渡す入力(キーボードから入力した文字列)
  • 標準出力:コマンド成功時の出力 ( 画面)
  • 標準エラー出力:エラー時の出力 (画面)

入出力にはOSが識別するために 番号が振られてる。 それがファイル記述子?
番号 出力先
0 標準入力(stdin)
1 標準出力(stdout)
2 標準エラー出力(stderr)
n 任意の入出力先

リダイレクトの記述

[N] はファイル記述子→ 省略可。 デフォルトは 入力の場合 0:標準入力 、 出力の場合1:標準出力

[N]< File : 入力のリダイレクト

  • Fileの内容を N で読み込める。

[N]> File : 出力のリダイレクト

  • 多分一番使ってるやつ
  • ファイルが存在しなかった場合は新規作成
  • command > Filecommand 1> Fileの省略形だったというわけだ

[N]>> File : リダイレクトによる追加出力

  • > と同じだけど追記モード

&> File, >& FIle : 標準出力と標準エラー出力のリダイレクト

  • 標準出力(ファイル記述子1)と標準エラー出力(ファイル記述子2)の両方を Fileに書き出す
  • ファイル記述子の複製(出力)とごっちゃになって混乱するので &> File で覚えるほうがよさそう

&>> File>>& File : 標準出力と標準エラー出力の追加出力

  • 標準出力(ファイル記述子1)と標準エラー出力(ファイル記述子2)の両方を Fileに 追記モードで書き出す

[N1]<&N2 : ファイル記述子の複製(入力)

  • ファイル記述子N1(入力)に ファイル記述子N2を複写する

[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
(´・_・`)

その他メモ

  • リダイレクトは記載した順番、左から右へと順番にファイル・ディスクリプターの参照を更新していく。

thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment