【发布时间】:2017-03-16 03:32:57
【问题描述】:
考虑以下示例脚本:
#!/bin/sh
do_something() {
echo $@
return 1
}
cat <<EOF > sample.text
This is a sample text
It serves no other purpose
EOF
cat sample.text | while read arg1 arg2 arg3 arg4 arg5; do
ret=0
do_something "$arg1" "$sarg2" "$arg3" "$arg4" "$arg5" <&3 || ret=$?
done 3<&1
重定向 stdout 作为文件描述符 3 的输入的目的是什么?
至少在Bash 中,如果省略它似乎没有任何区别。如果在bash以外的任何其他shell中执行它有什么影响吗?
更新
对于那些想知道它来自哪里的人,它是来自 Debian 的 cryptdisks_start 脚本的简化示例。
【问题讨论】:
-
这个脚本来自哪里?我很好奇作者的意图。正如您所观察到的,由于
do_something()不使用其标准输入,<&3 == 0<&3没有任何区别。 -
您对文件描述符的使用对您要执行的整体逻辑没有影响!
-
如果
do_something确实尝试从标准输入中读取,则会出现一个棘手的死锁。 -
基本上,当调用
do_something时,还没有将任何内容写入循环的标准输出,因此在其标准输入上没有任何内容可供读取。 -
@nautical,在基于 Web 的 SCM 界面(sourceforge、github、launchpad 等)的时代,大多数项目都有一个单独的源代码行可以直接在 Web 上链接——在鉴于此,“下载这个 tarball,解压它,然后找到包含 [...] 的文件”不是很合理的请求。
标签: linux bash shell io-redirection