我看到了下面的shell脚本。我想我知道它在做什么,但我仍然不明白使用这么多重定向和文件描述符的目的是什么?例如,exec 3>&1、do something 2>&1 1>&3和exec 3>&-。
#-Open file descriptor (fd)
exec 3>&1
#-Create a form and then store data to $VALUES variable
VALUES=$(dialog \
--keep-tite \
--ok-label "Submit" \
--backtitle "Linux User Managment" \
--title "Useradd" \
--form "Create a new user" \
15 50 0 \
"Username:" 1 1 "$user" 1 10 10 0 \
"Shell:" 2 1 "$shell" 2 10 15 0 \
"Group:" 3 1 "$groups" 3 10 8 0 \
"HOME:" 4 1 "$home" 4 10 40 0 \
2>&1 1>&3)
# close fd
exec 3>&-
# display values just entered
echo "$VALUES"你能告诉我为什么需要吗?是因为正在使用的dialog实用程序吗?我之所以这样问,是因为我从来没有见过人们用简单的命令(如ls等)来执行这些操作。
exec 3>&1
ls 2>&1 1>&3
exec 3>&-发布于 2014-06-04 21:13:18
通常,dialog通过stdout向用户显示其对话框,该对话框是文件描述符1,从文件描述符0 stdin读取用户的击键,并将用户填写的值输出到stderr,stderr是文件描述符2。
引入额外文件描述符的原因是通过$(command…)替换(与反引号相同)读取值。命令替换接收发送到其dialog…的内部命令(在本例中为stdout ),并将其填充到外部命令中(在本例中为VALUES=…)。
2>&1重定向使dialog将字段值发送到其stdout,并将它们捕获到VALUES中。因此,dialog需要一个不同的文件描述符来向用户显示对话框。exec 3>&1复制原始的stdout文件描述符。也就是说,在该命令之后,文件注释描述符3和文件注释描述符1引用同一个文件--原始的stdout。1>&3重定向使dialog将其对话框显示给原始stdout。
换句话说,引入文件描述符3的原因是临时“保存”stdout。
发布于 2014-06-04 20:46:11
分类很简单:
exec 3>&1任何写入文件描述符3的内容都将与文件描述符1 (标准输出)的位置相同。
VALUES=$(command ...arguments... 2>&1 1>&3)在这里,任何写入文件描述符2的标准错误,都将与文件描述符1标准输出的位置相同。但是,标准输出的定义会被更改,以便任何写入标准输出的内容都与文件描述符3相同。这是在命令替换$(...)操作中,因此标准输出通常被捕获在文件中。这意味着变量VALUES可以保存command写入标准错误的任何内容,而原始标准输出得到命令写入标准输出的任何内容。
最后:
exec 3>&-关闭文件描述符3;从现在开始,向其写入的尝试将失败。
您对该命令的模拟应该是:
exec 3>&1
variable=$(ls 2>&1 1>&3)
exec 3>&-这将捕获ls在$variable中的任何错误,同时允许您查看ls在标准输出上所写的任何内容。您不会看到这类事情是正常的,因为需求有点不寻常。
https://stackoverflow.com/questions/24047009
复制相似问题