关于标准输入。 `[n] 的任何示例

关于标准输入。 `[n] 的任何示例

有什么意义吗1<filename?也许它的意思是“键盘->标准输出”?

答案1

1<filename是一个重定向,它告诉 shell 打开文件filename进行读取,并使其在文件描述符 1 上可供正在运行的命令使用(或者对于整个 shell 进程,如果您使用重定向exec)。这是因为它通常适用于所有重定向:<标记输入重定向,前面的可选数字指定文件描述符编号。

该重定向的不寻常之处在于 fd 1 是为标准输出流保留的,因此程序通常假设它可以写入。如果它是通过输入重定向打开的,则此假设将失败。

$ touch filename
$ ls 1<filename
ls: write error: Bad file descriptor

如果您打开 fd 2 (stderr) 进行输入,或者打开 fd 0 (stdin) 进行输入,也会发生同样的情况输出

$ cat 0> filename
cat: -: Bad file descriptor

当然,如果无法写入 stderr,您将不会收到错误消息。您可能会得到一个虚假的非零退出状态。

答案2

我们确实不应该在标准输出上打开输入文件。 (exec在重定向之前你需要让它工作。但它可能仍然会失败并阻塞)如果你想用 fd 打开一个文件,只需使用 3 或其他。

exec 3<filename
# do something with fd 3
exec 3<&-

可以重定向到 fd 0 (stdin),但是如果你执行 fd 0 指向其他地方,那么你应该先保存它。

exec 3<&0
exec < filename
# do something with the file on fd 0
# restore stdin, free fd3
exec 0<&3 3<&-

相关内容