为后续bash命令使用新的文件描述符

为后续bash命令使用新的文件描述符,bash,file-descriptor,io-redirection,Bash,File Descriptor,Io Redirection,我正试图遵循并使用一个额外的输出文件描述符。我在跑步: 3>/tmp/foo echo hello >&3 但是我没有将hello放在/tmp/foo中,而是得到了一个错误: bash: 3: Bad file descriptor 为什么呢 注意:如果有必要,我使用的是bash4.4。似乎您必须说exec,以便文件描述符创建应用于后续命令。那么这个, exec 3>/tmp/foo echo hello >&3 不会给出错误消息。然而,正如@Ini

我正试图遵循并使用一个额外的输出文件描述符。我在跑步:

3>/tmp/foo
echo hello >&3
但是我没有将hello放在/tmp/foo中,而是得到了一个错误:

bash: 3: Bad file descriptor
为什么呢

注意:如果有必要,我使用的是bash4.4。

似乎您必须说exec,以便文件描述符创建应用于后续命令。那么这个,

exec 3>/tmp/foo
echo hello >&3
不会给出错误消息。然而,正如@Inian所说,这是一种糟糕的编码实践。相反,您应该让bash使用以下命令打开最小的可用新文件描述符:

exec {my_new_fd}>/tmp/foo
echo hello >&${my_new_fd}
这样,您可以确保您没有使用任何其他人的文件描述符进行交易。

似乎您必须说exec,以便文件描述符创建应用于后续命令。那么这个,

exec 3>/tmp/foo
echo hello >&3
不会给出错误消息。然而,正如@Inian所说,这是一种糟糕的编码实践。相反,您应该让bash使用以下命令打开最小的可用新文件描述符:

exec {my_new_fd}>/tmp/foo
echo hello >&${my_new_fd}

这样,您就可以确保您没有使用任何其他人的文件描述符。

您不应该随意选择文件描述符并开始使用它。你可以让shell找到下一个可用的,看看这个答案-请不要使用tdlp.org。它是过时的,不符合最新和推荐的bash标准。使用官方文档或Greg的wiki@Inian:Point take;另请参见“编辑我的答案”。您不应该随意选择文件描述符并开始使用它。你可以让shell找到下一个可用的,看看这个答案-请不要使用tdlp.org。它是过时的,不符合最新和推荐的bash标准。使用官方文档或Greg的wiki@Inian:Point take;另请参见对我的答案的编辑。