2017-04-01 50 views
0

我想從一個進程獲取標準輸出到另一個不使用標準輸入的進程,因爲那個用於另一個目的。將標準輸出到命令本身需要從自己的標準輸入讀取

總之我要完成這樣的事情:

echo "a" >&4 
cat | grep -f /dev/fd/4 

我得到了它運行使用文件作爲源文件描述符4,但是這不是我想要的:

# Variant 1 
cat file | grep -f /dev/fd/4 4<pattern 

# Variant 2 
exec 4<pattern 
cat | grep -f /dev/fd/4 
exec 4<&- 

我最好的嘗試是,但我得到以下錯誤信息:

# Variant 3 
cat | ( 
    echo "a" >&4 
    grep -f /dev/fd/4 
) <&4 

錯誤消息:

test.sh: line 5: 4: Bad file descriptor 

什麼是最好的方法來實現這一目標?

回答

4

你並不需要使用多個數據流來做到這一點:

$ printf foo > pattern 
$ printf '%s\n' foo bar | grep -f pattern 
foo 

如果不是你想使用一個命令的輸出作爲輸入-f你可以使用一個process substitution一個靜態文件:

$ printf '%s\n' foo bar | grep -f <(echo foo) 
foo 
+0

啊,我得到了進程替換錯誤:即使'grep -f <(echo FOO)-i'也可以工作。 但是沒有辦法做到這一點。我在我看來更可讀...(但也許這是一個錯誤的假設) – doak

+0

不,實際上它更可讀;) – doak

+0

你可以看看一些類似的問題:http://stackoverflow.com/questions/19715318/ – doak

0

對於缺乏進程替換POSIX殼,(例如dashashyash)。

如果命令允許字符串輸入,(grep允許的話),以及包含搜索目標的輸入字符串不是特別大,(即字符串不超過length limit for the command line),總有command substitution

$ printf '%s\n' foo bar baz | grep $(echo foo) 
foo 

或者,如果輸入文件是多行,用分離引述搜索項 '\ n' 的工作方式相同grepOR\|

$ printf '%s\n' foo bar baz | grep "$(printf "%s\n" foo bar)" 
foo 
bar 
+0

輸入很大,並有多行('grep'的幾種模式)。 @ l0b0解決方案匹配得更好。 – doak

+0

@doak,Re「*幾行​​」:那聽起來不那麼大。對於上述代碼的*多行*版本失敗,整個目標字符串列表的字節長度將需要(幾乎)大於'getconf ARG_MAX'的輸出,(* eg *在我目前的系統上那是* 2097152 *)。 – agc

+1

這是一個很好的選擇,沒有工藝替代。不過,我不喜歡多行版本中額外的'sed'。 – doak

相關問題