2016-12-21 3 views
0

Ich habe ein Bash-Skript, das normalerweise funktioniert wie folgt:einen Befehl in der Parameterliste eines anderen Befehls in bash Substituieren

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

aber ich möchte eine Option, um das Skript hinzuzufügen, es zu sagen, würde Holen Sie die Daten von einem Befehl mit einem anonymous named pipe anstelle der Datei. Dh, würde Ich mag, etwas zu tun

file=<(anothercmd arg1 $1 arg3) 

annähert und habe meine

docommand $x $y $file $z 

erweitern

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

Gibt es eine Möglichkeit, die Angabe richtig zu machen, das zu erreichen, ?

Für einen konkreteren Kontext betrachtet das Skript Ausgabeprodukte aus Regressionstests, die normalerweise aus einer Datei mit der erwarteten Ausgabe entfernt werden. Ich möchte optional eine Revision und ein diff zu dem dann erwarteten Ergebnis übergeben, also würde diff $from $to zu diff <(hg cat -r $fromrev $from) $to erweitern.

+0

"anonymous Named Pipe" ... ist das nicht ein komischer Name? –

+0

Der korrekte Ausdruck ist * Prozesssubstitution *. Welches Problem hast du beim Zitieren? Die Regeln zum Zitieren unterscheiden sich nicht von der Verwendung von Prozesssubstitution an anderer Stelle. – cdarke

+1

Ich glaube nicht, dass du es schaffen kannst. Die benannte Pipe, die für die Prozesssubstitution verwendet wird, ist temporär und verschwindet am Ende der Befehlszeile, an der sie verwendet wird. – Barmar

Antwort

1

Verwendung eval:

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

Beispiel

$ 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

Ich möchte auf die einfachen Anführungszeichen aufmerksam machen, wenn ich 'f' als einen Prozess definiere. Das funktioniert gut für meinen Fall, weil 'eval cat $ f' auch für den einfachen Dateifall wie' f = ~/.bashrc' unverändert funktioniert. –

+0

Es kann Sicherheitsüberlegungen geben, wenn der Dateiname ein Befehlszeilenargument ist. –

Verwandte Themen