2016-12-21 135 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 $from $to將擴展爲diff <(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

如果文件名是命令行參數,可能需要考慮安全因素。 –