有什么意义吗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<&-