
這很完美:
./foo | ./bar
但我想要這樣的東西:
./bar <| ./foo
所以我可以以相反的方式進行管道傳輸,並在命令列中更快地更改 foo 的參數。
管道需要是即時的 - 我的foo
程式永遠不會返回。
這可能嗎 ?
答案1
一個簡單而正確的方法是定義一個 foobar 函數,
foobar () { ./foo "$@" | ./bar ; }
(根據需要在命令列中,或在某些啟動腳本中,例如“.bashrc”)。然後每當你這樣做時:
foobar "this" that "and this also"
會的
./foo this that "and this also" | ./bar
答案2
./bar < <( ./foo )
例如:cat < <(echo "hello there!")
要了解其工作原理,請單獨考慮腳本的各個部分。
此語法:cat < /path/to/file
將讀取文件/path/to/file
並將其作為標準輸入傳輸到cat
.
此語法:<(echo "hello there!")
表示執行命令並將標準輸出附加到檔案描述符,例如/dev/fd/65
.整個表達式的結果是一個類似 的文本/dev/fd/65
,以及一個並行運行的命令並提供該文件描述符。
現在,組合起來,腳本將運行右側命令,將其通過管道傳輸到文件描述符,將該文件描述符轉換為左側命令的標準輸入,然後執行左側命令。
據我所知,沒有任何開銷,它與 完全相同a | b
,只是語法糖。
答案3
我認為你可以使用命名管道做類似的事情:
mypipe=$(mktemp -d /tmp/XXXXXX)/pipe
mkfifo $mypipe
grep something < $mypipe & tail > $mypipe -f some_input_file
rm $mypipe
或將命令中不變的部分放入 shell 腳本中:
./foo "$@" | ./bar
foo
並在腳本命令列上給出參數:
./myscript <args to foo>