"1 <"完成了什么?

jga*_*aeb 1 zsh io-redirection

我试图理解shell如何更好地处理重定向.我的理解是语法"n <"意味着重定向由"n"给出的文件描述符.

我正在努力理解的命令是

echo "first" > test; echo "second" 1< test
Run Code Online (Sandbox Code Playgroud)

我认为会发生的是文件"test"将被文本"first"覆盖; 然后,当执行第二个命令时,1 - 即stdout - 将被重定向到测试.

实际发生的是以下内容:

  1. 什么都没有写到终端,所以stdout被重定向到某个地方 ;
  2. 当我打开"测试"时,写的是"第一"而不是"第二",所以我没有覆盖"测试".

谁能解释一下发生了什么?是stdout被重定向到测试但是在"只读"模式或类似的东西?我找不到1<在其他地方使用脚本的任何参考(因为,诚然,这似乎是一件奇怪的事情).

Cha*_*ffy 7

shell重定向1<foo使FD 1,也就是stdout - 通常是输出描述符 - 连接到文件上的只读句柄foo.

因此,当echo尝试写入只读句柄时,它将失败; 在大多数合理的shell中,这也会向stderr写一条错误消息.

在这种情况下,该代码没有用处,只是一个bug; 你需要有一个试图从FD 1读取的程序(可能假设它是与当前终端的连接)才有意义.(也就是说,任何执行此操作的程序本身都会出错;如果不是通过FD 0,则应该直接从句柄执行读取/dev/tty).