首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这些重定向和文件描述符的目的是什么?

这些重定向和文件描述符的目的是什么?
EN

Stack Overflow用户
提问于 2014-06-04 20:30:44
回答 2查看 382关注 0票数 4

我看到了下面的shell脚本。我想我知道它在做什么,但我仍然不明白使用这么多重定向和文件描述符的目的是什么?例如,exec 3>&1do something 2>&1 1>&3exec 3>&-

代码语言:javascript
复制
#-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等)来执行这些操作。

代码语言:javascript
复制
exec 3>&1
ls 2>&1 1>&3
exec 3>&-
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-04 21:13:18

通常,dialog通过stdout向用户显示其对话框,该对话框是文件描述符1,从文件描述符0 stdin读取用户的击键,并将用户填写的值输出到stderrstderr是文件描述符2。

引入额外文件描述符的原因是通过$(command…)替换(与反引号相同)读取值。命令替换接收发送到其dialog…的内部命令(在本例中为stdout ),并将其填充到外部命令中(在本例中为VALUES=…)。

2>&1重定向使dialog将字段值发送到其stdout,并将它们捕获到VALUES中。因此,dialog需要一个不同的文件描述符来向用户显示对话框。exec 3>&1复制原始的stdout文件描述符。也就是说,在该命令之后,文件注释描述符3和文件注释描述符1引用同一个文件--原始的stdout1>&3重定向使dialog将其对话框显示给原始stdout

换句话说,引入文件描述符3的原因是临时“保存”stdout

票数 5
EN

Stack Overflow用户

发布于 2014-06-04 20:46:11

分类很简单:

代码语言:javascript
复制
exec 3>&1

任何写入文件描述符3的内容都将与文件描述符1 (标准输出)的位置相同。

代码语言:javascript
复制
VALUES=$(command ...arguments... 2>&1 1>&3)

在这里,任何写入文件描述符2的标准错误,都将与文件描述符1标准输出的位置相同。但是,标准输出的定义会被更改,以便任何写入标准输出的内容都与文件描述符3相同。这是在命令替换$(...)操作中,因此标准输出通常被捕获在文件中。这意味着变量VALUES可以保存command写入标准错误的任何内容,而原始标准输出得到命令写入标准输出的任何内容。

最后:

代码语言:javascript
复制
exec 3>&-

关闭文件描述符3;从现在开始,向其写入的尝试将失败。

您对该命令的模拟应该是:

代码语言:javascript
复制
exec 3>&1
variable=$(ls 2>&1 1>&3)
exec 3>&-

这将捕获ls$variable中的任何错误,同时允许您查看ls在标准输出上所写的任何内容。您不会看到这类事情是正常的,因为需求有点不寻常。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24047009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档