如何將標準輸出從右重定向到左

如何將標準輸出從右重定向到左

這很完美:

./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>

相關內容