読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】「> log.txt」したのにエラーだけ画面に出る。標準出力・標準エラー・パイプ【LPICレベル1】

22レスカテゴリ:Linux
1: 名無しさん

コマンド > log.txt で結果をファイルに保存したら、エラーメッセージだけ画面に出てきた
全部ファイルに入るんちゃうの

2: 名無しさん

>>1
出力には2本の道がある。標準出力(番号 )と標準エラー出力(番号 )。入力側の標準入力は番号
> は 1> の省略で、標準出力だけをファイルに向ける。エラーは 番の道やから画面に残る

3: 名無しさん

>>2
試してみた
ls a.txt nofile > out.txt 2> err.txt
out.txt に a.txt、err.txt に ls: cannot access 'nofile': No such file or directory が入った

4: 名無しさん

両方まとめて1つのファイルに入れるには?

5: 名無しさん

>>4
> both.txt 2>&1。2>&1 は「 番を、今の 番と同じ先に向ける」という意味
bash なら &> both.txt でも同じ

6: 名無しさん

>>5
順番を逆にして 2>&1 > both.txt でもええやろ

7: 名無しさん

>>6
あかん。リダイレクトは左から順に処理される
先に 2>&1 を処理した時点では 番はまだ画面やから、 番は画面に向く。そのあと 番だけがファイルに向く
結果、エラーは画面に出たまま

8: 名無しさん

> と >> の違いは

9: 名無しさん

>>8
> はファイルを空にしてから書く(上書き)。>> は末尾に追記する
うっかり上書きが怖いなら set -o noclobber。既存ファイルへの > が cannot overwrite existing file で失敗するようになる。それでも上書きしたいときは >|

10: 名無しさん

パイプ | も出力をつなぐやつやろ。エラーも流れるん

11: 名無しさん

>>10
パイプが渡すのは標準出力だけ
ls a.txt nofile | wc -l は (エラーは画面に出て、数えられない)
ls a.txt nofile 2>&1 | wc -l なら 。bash では |& と書いても同じ

12: 名無しさん

入力のほうの < は何に使うん

13: 名無しさん

>>12
ファイルを標準入力として渡す
wc -l u.txt は 4 u.txt とファイル名つきで出るけど、wc -l < u.txt は 4 だけ。wc はファイル名を知らされずに、流れてきた中身だけを数えてるから

14: 名無しさん

エラーがうるさいときの 2>/dev/null ってよく見る

15: 名無しさん

>>14
/dev/null は書き込んだものを全部捨てる特別なファイル
find / -name '*.conf' 2>/dev/null なら、読めないディレクトリの Permission denied を捨てて、結果だけ見られる

16: 名無しさん

画面にも出しつつファイルにも保存したい

17: 名無しさん

>>16
tee。コマンド | tee out.txt で、受け取った内容をファイルに書きながら、そのまま次に流す
追記したいなら tee -a

18: 名無しさん

sort file.txt > file.txt で並べ替えて上書きしたら、ファイルが空になった

19: 名無しさん

>>18
シェルは、コマンドを動かす前に > の先を空にする
sort が読みにいった時点で file.txt はもう空やから、空の結果が書かれる
別のファイルに出してから mv するか、sort -o file.txt file.txt を使う

20: 名無しさん

重複行を数える sort | uniq -c の sort っているん?uniq だけでよくない?

21: 名無しさん

>>20
uniq は隣り合った重複しかまとめない
b、a、b、a の4行に uniq をかけても4行のまま。sort で同じ行を隣に集めてから uniq -c すると、2 a と 2 b になる

22: 名無しさん

番号で覚えるのが一番やな。 が入力、 が出力、 がエラー
> もパイプも 番だけで、リダイレクトは左から

管理人のひとこと