Bash
將程序替換的文件描述符放入變數中
我有很長的命令大致是這樣的:
$ command-outer "long command which references a file here: filename1, and another file reference here: filename2"
這些文件是另一個命令的輸出。所以我在做:
$ command-outer "long ... "<(command-inner "again long params")"... "\ <(command-inner "again long params")" ..."
為了便於閱讀,我想
<()
從長命令呼叫中提取內部未命名/匿名管道(帶有 的管道)。但是我似乎不能這樣做;執行以下操作:RESULT_FILE_DESCRIPTOR1=<(command-inner ....)
RESULT_FILE_DESCRIPTOR1
導致當我在參數列表中實際使用時文件描述符已經被關閉command-outer
command-outer
並在同一行呼叫,因此:RESULT_FILE_DESCRIPTOR1=<(command-inner ....) outer-command "long ... $RESULT_FILE_DESCRIPTOR1 ... "
返回一個空結果 RESULT_FILE_DESCRIPTOR1,這並不奇怪,因為:
FOO=BAR echo $FOO
也不行。
您可以只命名命令,而不是命名結果。
param_set_1(){ input_command \ -lots \ -of \ -params } param_set_2(){ input_command \ -lots \ -of \ -other \ -params } command_outer -params <(param_set_1) <(param_set_2)
您還可以經常按名稱引用文件描述符。
param_set_1 | { param_set_2 | command_outer -params /dev/fd/3 -; } 3<&0
如果您真的希望在目前 shell 變數和文件描述符中得到結果,那麼您應該避開管道。您冒著用命令的輸出填充管道緩衝區的風險,同時嘗試在讀取過程耗儘管道緩衝區之前將這些結果分配給父 shell 變數,並且……好吧,它並不漂亮。因此,您應該一口氣完成所有操作,並使用 here-documents。
unset fd3 fd4 { command_outer -params /dev/fd/[34] } 3<<FD3 4<<FD4 ${fd3=$(param_set_1)} FD3 ${fd4=$(param_set_2)} FD4