> out.txt するとファイルには入るけど画面に何も出えへん
両方に出す方法ある?
【疑問】結果を画面に出しながらファイルにも残したい。tee・xargs・コマンド置換とヒアドキュメント【LPICレベル1】
前提のおさらい。> は標準出力をファイルへ(上書き)、>> は追記、2> は標準エラー出力。パイプ | は標準出力を次のコマンドの標準入力へ渡す
>>1tee を挟む。受け取ったものをファイルに書きながら、そのまま標準出力にも流すls / | tee out.txt | wc -l → 画面には行数、out.txt には一覧が入った
>>3
tee も既定では上書き。追記は tee -a
>>3
root しか書けないファイルに書くときの echo 設定 | sudo tee /etc/xxx もこれやな。sudo echo 設定 > /etc/xxx はリダイレクトを自分のシェルがやるから失敗する
出力をコマンドの「引数」にしたいときは?パイプやと標準入力に入るだけやん
>>6xargs を使う。標準入力から読んだものを、空白や改行で区切って引数に並べてコマンドを動かすfind . -name '*.tmp' | xargs rm
>>7
よく使うオプション-n 1 1回に渡す引数の数-I{} 入力の1行ずつを {} の場所に入れる(xargs -I{} cp {} {}.bak)-0 区切りをヌル文字にする(find -print0 と組み合わせる)
>>8-0 は何のため?
>>9
名前に空白があると切れるから。「f 3」というファイルで試したら、ls | xargs -n 1 echo rm は rm f と rm 3 に分かれた。find . -print0 | xargs -0 なら ./f 3 のまま渡った
>>6
コマンドの結果を、その場で文字列として埋め込むこともできる。コマンド置換n=$(wc -l < fruits) → n に行数echo "kernel: $(uname -s)" → kernel: Linux
>>11
古い書き方はバッククォートで囲むやつ。中身は同じで、$( ) のほうが入れ子にしやすい
>>2<< は何やったっけ
>>13
ヒアドキュメント。<<EOF から EOF だけの行までを標準入力として渡す<<EOF は中の変数を展開し、<<'EOF' とクォートすると展開しない<<< は1行の文字列を渡すヒアストリング(bash)
>>14tr a-z A-Z <<< "here string" → HERE STRING やった
>>3
画面とファイルの両方は tee、出力を引数にするのは xargs か $( )。パイプだけで足りんときの道具やな
管理人のひとこと
tee ファイルは受け取った入力をファイルに書きつつ標準出力に流す(-aで追記)。root のファイルへは| sudo tee。xargsは標準入力を区切って引数にしてコマンドを実行する。-n1回の数、-I{}置き場所の指定、-0はヌル区切り(find -print0と使い、空白を含む名前を守る)。- コマンド置換
$(コマンド)(古い書き方はバッククォート)は、結果をその場の文字列にする。 - ヒアドキュメント
<<EOF … EOFは複数行を標準入力に渡す(<<'EOF'で変数を展開しない)。<<<はヒアストリング。