2016-11-16 126 views
1

我試圖運行一個命令,該命令可以被簡化到這種結構:重定向標準輸入/輸出命令被取代

echo "A,B" | cp $(sed -e 's/A,//') $(sed -e 's/,B//') 

但是我奮力得到取代的命令右邊的輸入/輸出。 運行上述代碼產生此錯誤消息: sed的:在stdin讀取錯誤:輸入/輸出錯誤

當運行此代替:

echo "A,B" | cp <(sed -e 's/A,//') <(sed -e 's/,B//') 

命令不會終止。

我在這裏做錯了什麼?

回答

1

試試這個:

echo "A,B" | (IN=$(cat); cp $(echo $IN | sed -e 's/A,//') $(echo $IN | sed -e 's/,B//')) 

這將創建一個子shell並保存標準輸入輸入$IN變量。然後它在輸入上運行2 sed命令,並使用輸出作爲cp的參數。

2

sed兩個實例正在等待輸入自己的標準輸入,這是你的終端。管道連接到cp的標準輸入,而不連接到sed實例中的任一個。

試試這個:

read first second <<< "A,B" 
cp "${first}" "${second}" 

,或者:

var="A,B" 
cp "${var%,*}" "${var#*,}" 
+0

我想有是一個一行,做以下工作: 取一個命令的輸出,並處理多種不同的方式,並使用結果作爲輸入參數的另一個命令。 看起來'sed'實際上是獲取輸入,如: 'echo「123」| echo <$(sed -e's/2/4 /')' 返回:** zsh:沒有這樣的文件或目錄:143 ** –

+0

這兩個進程替換都從其中運行'cp'的shell繼承它們的標準輸入,所以'cp'和兩個'sed'的三個都會從管道讀取。 'cp'忽略標準輸入,所以它取決於'sed'計劃先運行的操作系統,並且能夠讀取傳入的字符串。 – chepner