的内容a.txt
:ba.txt
当我键入cat a.txt | xargs vi
时,vi 打开ba.txt
,一切似乎都很好......
但是当我退出vi时,我发现我的bash异常..我看不到我输入的指令。我输入了ls
. 我看不到它,但是当我按回车时,显示结果(以一种奇怪的方式..)...(输入后ls
,我输入ll
了。有一些汉字,请忽略它)..和bash 是这样的:
有人可以解释一下吗?
你的bash
外壳没有被破坏。只是您的终端处于某种不良状态-因为您向它发送了奇怪的字节-(终端具有某种状态-终端仿真器和内核管理该状态,该状态在进程错误地更改它后仍然存在。参见例如stty(1)命令、tty (4)手册页 about/dev/tty
和isatty(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 年代,我十几岁的时候做过一些工作。它非常有趣和嘈杂——一种机电通信打字机。
天啊,我老了,今天没人知道打字机到底是什么……
如果从管道内部调用 vi/vim,stdin
则连接到前一个管道的输出,而不是终端。vi/vim 是一个交互式命令,需要从终端(tty)接收其输入。
底线:您不能通过管道连接到 xargs vim,因为 vim 期望输入来自交互式终端。
如果你靠近你的终端,你会注意到 vi/vim 是这样写的:
Vim:警告:输入不是来自终端
PS:你可以使用:
cat file | xargs vim -Nu NONE
为了避免这种情况并使 vi/vim 非交互。
我认为 Basile 的回答很好地解释了为什么你的终端被搞砸了。他也给出了解决方案stty sane
。
当我想打开文件时,find, grep -l ...(in your case, the cat too)
我这样做:
vim $(find . ...)
你可以试试:
vim $(cat a.txt)
祝你好运。:)