为什么这是不可能的以及解决它的最佳方法是什么:
#!/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
)。错误的地方可能是给 shell的内容作为 shell 代码进行计算。eval "exec $desc< $file"
$file
通过zsh
,您还可以使用模块sysopen
中的内置函数zsh/system
:
zmodload zsh/system
sysopen -u "$desc" -r -- "$file"
在:zsh
、bash
和ksh93
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