cmd
2行のテキストを実行して出力します。
$ cmd
foo
bar
これを `/long/path/x.{load,conf} に書く必要があります。
このターゲットに書き込むには、手動で操作できないスーパーユーザー権限が必要です。
$ echo "foo" > /long/path/x.load
$ echo "bar" > /long/path/x.conf
〜のように「コマンドが開始され、権限を取得する前にリダイレクトが完了します。」
これを考えると扱いにくいテキスト文字列のプレースホルダなfoo
ので、bar
これを行うには良い方法は何ですか?
実際、私は多くの頭痛を引き起こさない解決策を探しています。これは一連のガイドラインの1つのステップを表し、説明を必要としないコードを書くことをお勧めしますが、常に可能なすべての方法に興味があります。小さなことをするために。
ベストアンサー1
Awkのリダイレクト演算子はここで便利です。このトピックにはいくつかのバリエーションがあります。
cmd | sudo awk '{print >"/long/path/x." (NR==1 ? "load" : "conf")}'
cmd | sudo x=/long/path/x awk 'NR==1 {print >ENVIRON["x"]".load"}
NR==2 {print >ENVIRON["x"]".conf"}'
cmd | sudo awk 'FNR==1 && NR!=1 {exit} {print >ARGV[NR-1]}' - /long/path/x.{load,conf}
最初は最も短くて簡単です。各行は、演算子の後にある式を評価することによって決定されたファイル名で印刷されます>
。現在の行番号NR
はファイル名を計算するために使用されます。式の連結は awk の文字列連結演算子です。