来自cat`bash`命令的意外输出

时间:2012-10-18 06:42:22

标签: bash shell unix operating-system cat

有人可以解释一下吗?我运行了如下所示的命令

$ cat `bash`

$ ls

$ ctrl+D

它在终端上给了我一些意想不到的输出。

注意:bash在反引号中。

1 个答案:

答案 0 :(得分:6)

好问题! “意外输出”是cat打印cwd中ls找到的所有文件。详细解释如下:

在你的第一行:

$ cat `bash`

bash部分实际上从原始shell生成一个新shell,因为bash被反引号括起来(反引号意味着在此上下文中运行附带的程序)

然后当你这样做:

$ ls

这实际上是在新生成的bash shell中完成的。它列出了新生成的bash shell所在的目录(应该与原始shell相同)。反过来,这实质上将第一步中的cat命令改为

$ cat file_1 file_2 ... file_x

(基本上ls返回的该目录中的所有文件。但是,你不会看到这些结果,因为输出正在等待打印到原始shell的stdout:cat正在等待评估stdout你的新bash shell。)

最后,当你这样做时:

$ ctrl+D

它退出您从原始shell生成的新bash shell,然后cat将所有打印到新shell中的stdout(来自ls的搜索结果)输出到旧shell中。

您可以验证我刚刚说的话:

$ cd ~/
$ mkdir temp_test_dir
$ cd temp_test_dir
$ echo "some text for file1" > file1
$ echo "other text for file2" > file2

现在运行你问题中的内容:

$ cat `bash`
$ ls
$ ctrl+D

这就是你应该看到的:

some text for file1
other text for file2

以某种顺序,只是cat输出ls找到的所有文件。