通常、必要なのは1つの引数のみです。
_echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file
_
2つの引数を渡す方法はありますか?何かのようなもの
_{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`
_
最初に両方の結果をファイルに保存できます
_echo abc > file1
echo xyz > file2
cat file1 file2
_
しかし、私は誤ってファイルを上書きする可能性がありますが、これは問題です。これは非対話型スクリプトになります。基本的に、ファイルに書き込むことなく、2つの任意のコマンドの結果をcat
に渡す方法が必要です。
更新:申し訳ありませんが、この例は問題を覆い隠しています。 _{ echo abc ; echo xyz ; } | cat
_は機能しているように見えますが、出力はecho
ではなくcat
sが原因です。
より良い例は、期待どおりに機能しない_{ cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,
_です。
と
_file1:
a,b
c,d
file2:
1,2
3,4
_
予想される出力は次のとおりです。
_b,1
d,3
_
解決済み:
プロセス置換 を使用:cat <(command1) <(command2)
または、mkfifo
を使用して名前付きパイプを作成します。
_mkfifo temp1
mkfifo temp2
command1 > temp1 &
command2 > temp2 &
cat temp1 temp2
_
Temp1とtemp2が事前に存在しないことを確認する限り、エレガントではなく、冗長ですが、正常に動作します。
「プロセスの置換」が必要だと思います http://tldp.org/LDP/abs/html/process-sub.html 。 zshでも動作しますが、オプションが多く、構文が異なる場合があります。
疑似ファイル(/dev/fd/something
)置換ごと。それはかなり便利です。コマンドは、ストリームとしてのみ読み取ることができます。つまり、fseekで前後に移動することはできません。パイプのように、バイトのストリームとして読み取る必要があります。
あなたの例はプロセス置換として機能します:
cat <(echo abc) <(echo xyz)
paste -d, <(cut -f2 -d, file1) <(cut -f1 -d, file2)
プロセスを使用するツールと考え、一時ファイルのないファイルのふりをしてください。
(私の- 以前の答え から)
私はxargsが好きです。例として、/ usr/localの下にあるすべてのmysqlデータディレクトリのサイズを確認します。
osx:local user $ pwd /usr/local osx:local user $ ls | grep mysql mysql mysql-5.0.51a-osx10.5-x86_64 mysql-5.0.51b-osx10.5-x86_64 mysql-5.1.39 -osx10.5-x86_64 mysql-5.6.17-osx10.7-x86_64 os x:local user $ ls | grep mysql | Sudo xargs du -sh 4.0K mysql 2.8G mysql-5.0.51a-osx10.5-x86_64 10G mysql-5.0.51b-osx10.5- x86_64 25G mysql-5.1.39-osx10.5-x86_64 753M mysql-5.6.17-osx10.7-x86_64 osx:local user $
中かっこが実際に機能したのは、パイプオペレーターがグループ化されたコマンドの標準出力を3番目の標準入力に接続するためです。
標準入力を使用しないコマンドを実行することで、エコーからの出力ではないことを確認できます。 { echo 1; echo 2;} | echo 3
は、1ではなく3を出力します\ n2\n3。
ただし、中括弧内の2つのコマンドは同じ結果にcat
- ingするような結果を書き込んでいるため、これは望ましいことではありません。 paste
などのコマンドの2つの引数として使用する2つの異なる結果を生成するには、一時ファイルまたは名前付きパイプを使用する必要があります。
mktemp
を使用して一意の一時ファイルを生成するか、mkfifo
を使用してFIFOパイプファイルを作成します。