2016-12-21 4 views
0

に別のコマンドのパラメータリストにコマンドを代入私は通常、このように動作しますbashスクリプトを持っている:bashの

[...] 
file=$1 
docommand $x $y $file $z 

が、私はそれを言うだろうスクリプトにオプションを追加したいですファイルの代わりにanonymous named pipeを使用してコマンドからデータを取得します。 すなわち、私はそれを達成するために引用権利を取得する方法はあり

file=<(anothercmd arg1 $1 arg3) 

を近似何かをして、私の

docommand $x $y $file $z 

拡大へ

docommand $x $y <(anothercmd arg1 $1 arg3) $z 

をしたいのですが?

より具体的な文脈では、スクリプトは回帰テストの出力プロダクトを調べ、通常は期待される出力を持つファイルからそれらを区別します。場合によってはリビジョンを渡して、期待される結果にdiffを渡したいので、diff $from $todiff <(hg cat -r $fromrev $from) $toに展開されます。

+0

"匿名の名前付きパイプ" ...は面白い名前ということではないでしょうか? –

+0

正しい用語は*プロセス置換*です。あなたは引用でどんな問題を抱えていますか?クォートの規則は、他の場所へのプロセス置換を使用しても変わりません。 – cdarke

+1

私はあなたがそれをすることができるとは思わない。プロセスの置換に使用される名前付きパイプは一時的なもので、使用されているコマンドラインの最後にあります。 – Barmar

答えて

1

使用のeval:

eval docommand $x $y <(anothercmd arg1 $1 arg3) $z 

$ f='<(ps)' 
$ echo $f 
<(ps) 
$ cat $f 
cat: '<(ps)': No such file or directory 
$ eval cat $f 
    PID TTY   TIME CMD 
4468 pts/8 00:00:00 mksh 
4510 pts/8 00:00:00 bash 
4975 pts/8 00:00:00 bash 
4976 pts/8 00:00:00 cat 
4977 pts/8 00:00:00 ps 
$ 
+0

プロセスとして 'f'を定義するときに一重引用符に注意したいと思います。 'eval cat $ f'も' f =〜/ .bashrc'のような単純なファイルの場合でも変わらないので、これは私の場合にはうまくいきます。 –

+0

ファイル名がコマンドライン引数であるかどうかについては、セキュリティ上の考慮事項があります。 –