opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

パイプとかリダイレクトとか

これで本日はラスト。ほんとに。

今までなんとなく使ってきてあんまり知らなかったパイプとかリダイレクト周りをちゃんと勉強してみた。

パイプのお話

まずは最も単純な例

$ echo "hello world" | less

とするとhello worldがlessで表示される。 これは

$ cmd1 | cmd2

とするとcmd1のstdout(標準出力)がstdin(標準入力)に連結される。 つまりcmd1の出力がそのままcmd2のstdinに流れていくことになる。

また、

$ cmd1 |& cmd2

とする。これはcmd1のstdoutとstderr(標準エラー)がstdinに流れていく。

リダイレクトのお話(出力)

リダイレクトは例えばstdoutとhello.txtにといった具合に現在開いているファイル記述子の入出力を別のファイルに切り替えること(らしい)

例えば

$ echo "hello world" > hello.txt

とするとhello.txtには"hello world"と書き込まれている。

ちなみに、これを難しそうな感じに書くと

$ echo "hello world" | 1> hello.txt

というふうにも書ける。echo "hello world"の出力をパイプであとに渡しているが、あとの部分はどんな感じの意味になっているかというと

N> File

という構造で、N番のファイル記述子(出力)をFileに切り替える という処理。 ちなみに

N > File

とスペースを開けてしまうと"N"というコマンドとして認識されるので"N>"とスペースは詰める。

で、上の"1> hello.txt"を改めてみてみると、1というのはstdoutを表す。つまり標準出力に来た文字はすべてhello.txtに流しなさい。という意味。

よって、上のコマンドは最初のコマンドと等価。

また、

$ echo "How are you?" | 1>> hello.txt

とすると、hello.txtの内容に上書きする。よって

$ echo "Hello world" | 1> hello.txt
$ echo "How are you?" | 1>> hello.txt

とすると、hello.txtの中身は

 Hello world
 How are you?

となる。

ここまでは、主に出力のリダイレクトに関するお話。 続いて入力に関するお話。

リダイレクトのお話(入力)

入力は

N< File

という形式でリダイレクトする。N番のファイル記述子の入力をFileに切り替える という意味。 例えば

$ less hello.txt

とするとhello.txtの内容が表示されるが、これ以外でlessでhello.txtを表示させるとき

$ 0< hello.txt | less

とする。(0は標準入力stdinを指す) これでもhello.txtの内容が表示される。

リダイレクトのお話(その他)

その他に明日から使えそうなリダイレクトの書き方みたいな奴を乗っけておく。

N1<&N2

これは、ファイル記述子N1(入力)にファイル記述子N2を複写(dup)する

N1>&2

とすると、出力用になる。意味は出力用になっただけで同様。

N<&-

とすると、N番のファイル記述子を閉じる(Nを省略するとstdin) 同様に出力版を次に示す。

N>&-

同じくNを省略できる。

あと...

cmd1 >& /dev/null

という具合に">&"を使うことで標準出力及びエラー出力をリダイレクトできる。上の例では/dev/nullに捨てている。 (&>と書くことで ">& 1"のように数値を指定した場合も正しく動作するようになる。&>は本にはZsh限定みたいに書いてるけどうちのbashとsh環境ではなぜか使えた)

同様に

cmd1 >>& /dev/null

とすると、追記モードになる。まあ、/dev/nullに対して追記しても意味ないけど。

ヒアドキュメント

$cat<<EOF
hello
I have many line
thanks.
EOF

なんていう記述をするのがヒアドキュメント

N<< Delimiter
内容
内容
.
.
.
Delimiter

とすることで、Delimiterで挟まれた部分を内容として認識する。

例えば、簡単なテキストを書きた場合などに便利?

$ cat<<EOF > main.c
#include<stdio.h>
int main(){
printf("hello¥n");
return 0;}
EOF

とするとmain.cにEOFに挟まれてる内容が出力される。

終わり

終わりです。なんというか部分部分参考書そのままで申し訳ないです...というかこれって問題あるんじゃね? まあいいか... 指摘されたらどうとでもしよう。

ということで、明日大学バッチリあるので。寝ます。 今週は全部18時くらいから何らかの集合があってやヴぁい。 あと宿題もやヴぁい。あと化学と線形がやばい感がするんだけど化学も線形も教科書が売り切れでオワタ 化学とか来週とか行ってたけど明日昼には入手できなかったらまた教科書なしで授業受けて意味不明なことに... いや、ネットは誰が見てるかわからないからなんまりアレなことは書かないけどね。 うん。

Firefox ブラウザ無料ダウンロード