2016-08-21 47 views
3

在終端(bash)的下列工作正常:SH -c和進程替換

cat <(echo "hello") 

但是,如果我做的:

sh -c 'cat <(echo "hello")' 

我得到

sh: 1: Syntax error: "(" unexpected 

你能解釋一下之所以?

順便說一句,我的總體目標是在shell腳本寫這個命令:

watch -n 1 'cat <(iptables -L INPUT) <(iptables -L FORWARD)' 

,但它不會工作,原因似乎是上述問題。

回答

2

sh通常是dash而不是bash(參見man sh)。 dash不做進程替換,只有POSIX的東西。

你需要做的事:

bash -c 'cat <(echo "hello")' 

ksh & zsh能做的進程替換了。

你的榜樣,你可以簡單地做:

watch -n 1 'iptables -L INPUT; iptables -L FORWARD' 

不需要先進的殼或過程託換。

+0

謝謝!我接受了hek2mgl的回答,因爲他先回答了。 – Markus

+1

謝謝,但這不是正確的原因。 :)接受你認爲對你最有幫助的答案。請檢查屬於重複問題的答案。他們更詳細地解釋了這個問題。 – hek2mgl

+0

@ hek2mgl謝謝。如果他認爲我們的答案同樣好,這可能是一個很好的理由。 – PSkocik

0

語法錯誤的原因是sh未鏈接到系統上的bash,並且不理解process substitution,它不屬於POSIX標準的一部分。

我建議下面的命令是更清潔,與任何兼容POSIX外殼作品:

while true ; do 
    clear 
    iptables -L INPUT 
    iptables -L FORWARD 
    sleep 1 
done