bash - 我想知道执行此命令时发生了什么?

标签 bash

cd / | vi

这是我在 bash shell 中输入的命令。 执行此命令时,它只会打开 vi 编辑器。然后我就不再使用 :q 了。 现在我在 bash shell 中。 当我们在此处键入任何命令时,它不会显示,但会执行该命令。 我想知道它被重定向到哪里。

最佳答案

不是 100% 确定,但我想谈谈我的看法。

我认为这与输入/输出控制有关。

阅读 cd 的手册页:

STDOUT
       If a non-empty directory name from CDPATH is used, or if cd − is 
used, an absolute pathname of the new working directory shall be written to the 
standard output
           as follows:

           "%s\n", <new directory>

       Otherwise, there shall be no output.

也就是说,如果你cd/,stdout是/dev/null,pipe使stdout成为vim的stdin。

当 vim 启动时,它会保存终端设置、输入/输出控制。但是如果它是 /dev/null,而不是 tty 文件描述符,vim 将不会有正确的设置。在你退出 vim 后,它会在你的终端上应用那些不正确的东西。

要测试,执行这个:

cd -|vim

cd - 会有标准输出,然后 vim 有正常的标准输入,退出 vim 后,终端应该仍然可以正常工作。

然后试试这个:

vim </dev/null

这与 cd/|vim 相同,退出 vim 后,您的终端行为异常,与 cd/|vim 相同

stty sane

可以拯救您的终端。

关于bash - 我想知道执行此命令时发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25849374/

相关文章:

bash - 使用 gpg2 无人值守生成 ECDSA key

bash - 在 bash 中的复合命令中设置变量失败(命令组)

linux - Bash 脚本忽略 if, then 语句;每次返回相同的结果

php - 通过 cron 作业时未执行 Bash 命令 - PHP

bash - 从终端输出中删除发送命令,同时保留所需的输出

c++ - 将 ls 输出转换为整数

python - 在 Fabric 中使用环境变量

linux - 在 Bash 脚本中将单词定义为变量

mysql - 在出现如此多的空格后从行中删除空格

python - 使用 SIGINT 终止程序会使我的 shell 无法使用,为什么?