![如何使用存储在变量中的文件描述符?](https://linux22.com/image/157010/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%AD%98%E5%82%A8%E5%9C%A8%E5%8F%98%E9%87%8F%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6%EF%BC%9F.png)
例如,如果我分配
TWO=2
...以下失败(带有date: invalid date '2'
):
date >> logfile $TWO>&1
当然,我总是可以做
eval "date >> logfile $TWO>&1"
这是运行包含流重定向(其中至少某些文件描述符显示为变量)的表达式的唯一方法吗?
答案1
你可以做
5<&"$fd"
:在任何类似 Bourne 的 shell 中将 fd 复制到 fd 5(其中 5 是文字)(但请注意,当 yash 处于 posix 模式时,如果未打开以供读取,$fd
则该功能将不起作用)。$fd
{fd}<&-
:关闭$fd
zsh、bash、ksh93 中的fd
但是您不能这样做,因为如果该内容恰好只包含十进制数字,"$fd">anything
您不想不输出intoecho "$something">file
的内容。$something
file
在 zsh、bash 和 ksh93 中,您可以使用{fd}> something
9 以上的 fd 自动分配已存储进入$fd
,但这不是你要问的。
据我所知,除了使用eval
.
您可以eval
仅使用以下命令将使用限制为重定向exec
:
(eval "exec $TWO>&1"; exec date) >> logfile
在shell中也是同样的情况fish
。
在 和 导数中也是如此rc
,其中语法为>[3=5]
,并且两个 fd 都必须是文字。