Tim*_*Tim 6 shell pipe io-redirection
我想知道重定向和管道之间的差异和关系。
command >& 2
。com1 | com2
可以被重定向替换为com1 >
tempfile; com2 < tempfile
。可以将替换修改为不使用文件吗?感谢致敬!
是的。更准确地说,在 shell 中,管道将左侧命令的标准输出连接到右侧命令的标准输入。更准确地说,foo | bar
对 shell 的意义是:
foo
在这个子进程中执行。bar
在这个子进程中执行。是的。普通重定向按名称指示文件:>foo
. 另一种重定向形式通过描述符指示文件。例如,>&2
表示“将标准输出重定向到当前连接到的任何文件描述符 2”。
关于该主题,请注意重定向是从左到右处理的。例如,要将标准输出和标准错误重定向到同一个文件,请使用foo >filename 2>&1
. foo 2>&1 >filename
在终端中键入的命令首先将标准错误连接到终端(此时标准输出和标准错误仍然连接到终端,因此不会有任何区别),然后将标准输出连接到文件。
对,但是。shell 中的管道构造创建了一个匿名管道;还有命名管道。
mkfifo f
cat f
# (in another terminal)
echo hello >f
Run Code Online (Sandbox Code Playgroud)
命名管道比管道少见得多。当需要连接两个独立启动的进程时使用它们;这并不经常发生,但在必要时拥有它是很好的。
请注意,您提供的替换:foo >tempfile; bar <tempfile
不同:首先foo
将其所有输出写入临时文件,然后bar
开始运行。使用管道,命令并行运行。
是的,但不是很有用。
cat input_file | some_command # a uselessly complicated way of writing some_command <input_file
echo hello | tee output_file # a uselessly complicated way of writing echo hello >output_file
Run Code Online (Sandbox Code Playgroud)