在bash中,您可以执行以下操作:
echo test >&1(重定向到stdout,尽管它已经在那里了)
echo test >&2(重定向到stderr)
echo test >&0(重定向到stdin)
当我做最后一个时,我的终端仍然会像其他两个一样打印test,但很难知道为什么。那么首先,为什么这一切都有效?其次,重定向到stdin有什么好的用途吗?

最佳答案

更准确地说,>&0所做的是将文件描述符0复制为文件描述符1。如果程序的stdin只为读取而打开,那么当程序试图写入stdout(文件描述符1)时,它将得到一个错误,因为文件描述符1也只为读取而打开。
您可以通过编写一个检查自己的文件描述符的小型shell脚本来演示这一点:
10156115.sh编号:

#!/bin/bash
bash -c 'ls -l /proc/$$/fd' >&0

然后用可识别的stdin、stdout和stderr调用它:
$ touch stdin
$ ./10156115.sh < stdin > stdout 2> stderr

结果是在stderr中得到以下结果:
ls: write error: Bad file descriptor

但是,默认情况下,这三个都是终端:(简化输出)
$ ls -l /proc/$$/fd
lrwx------ 0 -> /dev/pts/14
lrwx------ 1 -> /dev/pts/14
lrwx------ 2 -> /dev/pts/14
lrwx------ 255 -> /dev/pts/14

通常,这三个都是开放读+写的,因此如果单独使用普通shell,那么>&0重定向根本没有效果。
这个有什么用吗?
这种方法没有任何常见的用途,但是如果任何人调用您的脚本重定向stdoutstderr,无论出于何种原因,您都无法更改它,那么您可能会将其作为一种肮脏的黑客来获取打印到终端的方法:
if [ ! -t /dev/fd/1 -a ! -t /dev/fd/2 -a -t /dev/fd/0 ]; then
    echo "My message that I really, really want to go to a terminal" >&0
fi

但我不建议你这么做。

关于bash - '>&0'(重定向到stdin)有什么用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10156115/

10-14 17:48
查看更多