web-dev-qa-db-ja.com

パイプを使用してコマンドに2つの引数を渡す

通常、必要なのは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ではなくcatsが原因です。

より良い例は、期待どおりに機能しない_{ 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が事前に存在しないことを確認する限り、エレガントではなく、冗長ですが、正常に動作します。

24
goweon

「プロセスの置換」が必要だと思います 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)

プロセスを使用するツールと考え、一時ファイルのないファイルのふりをしてください。

(私の- 以前の答え から)

17
Rich Homolka

私は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 $ 

xargs

2
dab

中かっこが実際に機能したのは、パイプオペレーターがグループ化されたコマンドの標準出力を3番目の標準入力に接続するためです。

標準入力を使用しないコマンドを実行することで、エコーからの出力ではないことを確認できます。 { echo 1; echo 2;} | echo 3は、1ではなく3を出力します\ n2\n3。

ただし、中括弧内の2つのコマンドは同じ結果にcat- ingするような結果を書き込んでいるため、これは望ましいことではありません。 pasteなどのコマンドの2つの引数として使用する2つの異なる結果を生成するには、一時ファイルまたは名前付きパイプを使用する必要があります。

mktempを使用して一意の一時ファイルを生成するか、mkfifoを使用してFIFOパイプファイルを作成します。

2
billc.cn