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


22

通常、引数を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

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


1
これは私の頭を傷つけます。2つの異なるコマンドを1つの猫にパイプしたいですか?
user606723

2
「配管」と「引数」は、まったく関係のない2つの概念であることを知っていますか?
イグナシオバスケス-エイブラムス

@Ignacio err ...私はLinuxにそれほど精通していないので、違いを本当に知りません。パイピングとは、以前の結果を引数として取ることを意味すると常に考えていました。私を啓発する気ですか?
-goweon

@firebatいいえ、パイプは、前のコマンドの標準出力を次のコマンドの標準入力として使用することを意味します。あなたはまだ別の概念である引数を持つことができます。
リッチホモルカ

また、Updateテキストに関する限り、出力はcatから来ます。ただ、文をcatとは別のように見せたいだけです。これは、1つのストリームにシリアル化されるため実行できません。
リッチホモルカ

回答:


17

'Process Substitution' 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)

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

以前の回答から)


2

パイプ演算子はグループ化されたコマンドの標準出力を3番目の標準入力に接続するため、中括弧は実際に機能しました。

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

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

あなたは使用することができますmktempユニークな一時ファイルを生成したり、mkfifoFIFOパイプファイルを作成します。


あなたの答えに感謝します。私はこの解決策を何日も探して、最終的にあなたの答えをここで見つけました。
サイードファルサフィン

2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.