【问题标题】:Unexpected output from cat `bash` commandcat `bash` 命令的意外输出
【发布时间】:2012-10-08 13:18:44
【问题描述】:

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

$ cat `bash`

$ ls

$ ctrl+D

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

注意:bash 在反引号中。

【问题讨论】:

  • 我很好奇。你想做什么?
  • 这里有点离题了。 SO 用于编程问题。
  • @doubleDown 我只是想了解 bash shell 在反引号中执行时的行为。

标签: bash shell unix operating-system cat


【解决方案1】:

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

在你的第一行:

$ cat `bash`

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

那么当你这样做时:

$ ls

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

$ cat file_1 file_2 ... file_x

(基本上该目录中的所有文件都由 ls 返回。但是,您不会看到这些结果,因为输出正在等待打印到原始 shell 的标准输出:cat is waiting to evaluate the stdout of你的新 bash shell。)

最后,当你这样做时:

$ ctrl+D

它会退出您从原始 shell 生成的新 bash shell,然后 cat 将打印到新 shell 中标准输出的所有内容(来自 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 找到的所有文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多