使用变量文件描述符执行

使用变量文件描述符执行

为什么这是不可能的以及解决它的最佳方法是什么:

#!/bin/sh
desc=5; file=/etc/passwd
exec "$desc"<"$file" #the variable filedescriptor is the problem

我宁愿不eval

答案1

好吧,至于为什么它不可能,你不会想要:

echo "$text">file

$x如果碰巧是一个数字,则停止工作。

你需要这样做:

eval 'exec '"$desc"'< "$file"'

让 shell 评估exec 5< "$file"代码。eval只要您小心地只扩展其参数中需要扩展的内容(并且这些扩展是安全的)就可以(这里对除 之外的所有内容使用强引号$desc)。错误的地方可能是给 shelleval "exec $desc< $file"的内容作为 shell 代码进行计算。$file

通过zsh,您还可以使用模块sysopen中的内置函数zsh/system

zmodload zsh/system
sysopen -u "$desc" -r -- "$file"

在:zshbashksh93

exec {desc}>&-

可以关闭存储在 中的 fd $desc,但是在

exec {desc}> file

shell 分配一个大于 10 的 fd 并且分配它到$desc.这不能用于打开预先file存储的 fd $desc

请注意,这是exec >&"$desc"有效的,因为那里没有歧义...除了 inzsh和最近版本bash有一个>&运算符将 stdout 和 stderr 重定向到文件(如csh),并且只有在不是数字echo something >& "$file"时才有效。$file

相关内容