3

的内容a.txtba.txt

当我键入cat a.txt | xargs vi时,vi 打开ba.txt,一切似乎都很好......

但是当我退出vi时,我发现我的bash异常..我看不到我输入的指令。我输入了ls. 我看不到它,但是当我按回车时,显示结果(以一种奇怪的方式..)...(输入后ls,我输入ll了。有一些汉字,请忽略它)..和bash 是这样的:

重击

有人可以解释一下吗?

4

3 回答 3

4

你的bash外壳没有被破坏。只是您的终端处于某种不良状态-因为您向它发送了奇怪的字节-(终端具有某种状态-终端仿真器和内核管理该状态,该状态在进程错误地更改它后仍然存在。参见例如stty(1)命令、tty (4)手册页 about/dev/ttyisatty(3)函数)。键入(可能是盲目地)reset命令(或stty sane)以重置终端。

大多数终端都响应ANSI 转义码(有关丑陋的细节,请阅读与配置这些转义码相关的termcap(5) )。发送任意或随机字节的命令可能会发送一些转义序列,这可能会损坏终端的行为。

但是,您的使用vi可能是错误的。对于可编程版本,请考虑使用sed(1)ed(1);或者也许emacs --batch....

如果您只想编辑ba.txt由内部行命名的文件,a.txt您可以运行:

 vi $(cat a.txt)

或者更好的是,使用标准EDITOR变量(参见environ(7)

 $EDITOR $(cat a.txt)

另请阅读高级 Bash 脚本指南。您可能会使用反引号,请参阅此答案,但我不建议使用它们。


由于历史原因,终端模拟tty -s (按照那个链接,它解释了很多),这是非常复杂和神秘的物理设备。你可能太年轻了(在博物馆外)见过它们。在 1970 年代,我十几岁的时候做过一些工作。它非常有趣和嘈杂——一种机电通信打字机。

天啊,我老了,今天没人知道打字机到底是什么……

于 2013-07-18T07:50:03.063 回答
4

如果从管道内部调用 vi/vim,stdin则连接到前一个管道的输出,而不是终端。vi/vim 是一个交互式命令,需要从终端(tty)接收其输入。

底线:您不能通过管道连接到 xargs vim,因为 vim 期望输入来自交互式终端

如果你靠近你的终端,你会注意到 vi/vim 是这样写的:

Vim:警告:输入不是来自终端

PS:你可以使用:

cat file | xargs vim -Nu NONE

为了避免这种情况并使 vi/vim 非交互。

于 2013-07-18T07:55:52.773 回答
1

我认为 Basile 的回答很好地解释了为什么你的终端被搞砸了。他也给出了解决方案stty sane

当我想打开文件时,find, grep -l ...(in your case, the cat too)我这样做:

vim $(find . ...)

你可以试试:

vim $(cat a.txt)

祝你好运。:)

于 2013-07-18T08:25:12.027 回答