Bash

將程序替換的文件描述符放入變數中

  • September 28, 2015

我有很長的命令大致是這樣的:

$ 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

引用自:https://unix.stackexchange.com/questions/232499