![$ sh < foo > bar 这个语句是问题](https://linux22.com/image/112811/%24%20sh%20%3C%20foo%20%3E%20bar%20%E8%BF%99%E4%B8%AA%E8%AF%AD%E5%8F%A5%E6%98%AF%E9%97%AE%E9%A2%98.png)
下面的命令是做什么的?我是新人,还在学习。
$ sh < foo > bar
如何逐步解释它,以便我可以清楚地理解更多这样的问题。
答案1
让我们来分解一下。该命令分为三部分:
sh
sh
是要运行的程序的名称,在本例中为sh
.
< foo
<
simbol 表示后面的单词是文件名,并命令 shell(执行命令的 shell,与 sh 无关,被调用的程序,恰好是 shell)加入到标准输入foo
在本例中,程序将其名称跟随在符号后面的文件的内容。
> bar
>
符号命令 shell 将正在执行的程序的标准输出加入到文件中bar
。
这些重定向路径是在程序开始执行之前设置的。
因此,整个命令sh < foo > bar
在 shell 上运行时。使程序sh
从文件读取命令foo
并将其输出存储在文件中bar
。如果该文件foo
不存在,则会发生错误。 shell 的行为取决于文件是否存在,由您使用的 shell 的选项bar
决定。noclobber
答案2
一般来说,
$ utility <input >output
将导致utility
被执行标准输入流连接到文件input
及其标准输出流连接到文件output
。
该行开头$
的是 shell 提示符(您不会键入它)。
对于sh
shell 命令解释器,这将导致sh
从输入文件(foo
在您的情况下)读取并执行 shell 命令,并将任何输出写入输出文件(bar
在您的情况下)。诊断消息(错误和警告)仍将显示在终端上,因为这些消息通常写入标准错误流,您提到的命令行不会重定向到任何特定的地方。
您提到的命令或多或少具有相同的效果
$ sh foo >bar
sincesh
能够从命令行上提到的文件中读取,并且只有在没有提到文件的情况下才会从标准输入流中读取。