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

【疑問】結果を画面に出しながらファイルにも残したい。tee・xargs・コマンド置換とヒアドキュメント【LPICレベル1】

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

> out.txt するとファイルには入るけど画面に何も出えへん
両方に出す方法ある?

2: 名無しさん

前提のおさらい。> は標準出力をファイルへ(上書き)、>> は追記、2> は標準エラー出力。パイプ | は標準出力を次のコマンドの標準入力へ渡す

3: 名無しさん

>>1
tee を挟む。受け取ったものをファイルに書きながら、そのまま標準出力にも流す
ls / | tee out.txt | wc -l → 画面には行数、out.txt には一覧が入った

4: 名無しさん

>>3
tee も既定では上書き。追記は tee -a

5: 名無しさん

>>3
root しか書けないファイルに書くときの echo 設定 | sudo tee /etc/xxx もこれやな。sudo echo 設定 > /etc/xxx はリダイレクトを自分のシェルがやるから失敗する

6: 名無しさん

出力をコマンドの「引数」にしたいときは?パイプやと標準入力に入るだけやん

7: 名無しさん

>>6
xargs を使う。標準入力から読んだものを、空白や改行で区切って引数に並べてコマンドを動かす
find . -name '*.tmp' | xargs rm

8: 名無しさん

>>7
よく使うオプション
-n 1 1回に渡す引数の数
-I{} 入力の1行ずつを {} の場所に入れる(xargs -I{} cp {} {}.bak)
-0 区切りをヌル文字にする(find -print0 と組み合わせる)

9: 名無しさん

>>8
-0 は何のため?

10: 名無しさん

>>9
名前に空白があると切れるから。「f 3」というファイルで試したら、ls | xargs -n 1 echo rm は rm f と rm 3 に分かれた。find . -print0 | xargs -0 なら ./f 3 のまま渡った

11: 名無しさん

>>6
コマンドの結果を、その場で文字列として埋め込むこともできる。コマンド置換
n=$(wc -l < fruits) → n に行数
echo "kernel: $(uname -s)" → kernel: Linux

12: 名無しさん

>>11
古い書き方はバッククォートで囲むやつ。中身は同じで、$( ) のほうが入れ子にしやすい

13: 名無しさん

>>2
<< は何やったっけ

14: 名無しさん

>>13
ヒアドキュメント。<<EOF から EOF だけの行までを標準入力として渡す
<<EOF は中の変数を展開し、<<'EOF' とクォートすると展開しない
<<< は1行の文字列を渡すヒアストリング(bash)

15: 名無しさん

>>14
tr a-z A-Z <<< "here string" → HERE STRING やった

16: 名無しさん

>>3
画面とファイルの両方は tee、出力を引数にするのは xargs か $( )。パイプだけで足りんときの道具やな

管理人のひとこと