【问题标题】:Why "cat a.txt | xargs vi" destroy the bash? [closed]为什么“cat a.txt | xargs vi”会破坏 bash? [关闭]
【发布时间】:2013-07-18 07:48:03
【问题描述】:

a.txt的内容:ba.txt

当我输入cat a.txt | xargs vi 时,vi 打开ba.txt,一切似乎都正常...

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

谁能解释一下?

【问题讨论】:

  • @doubleDown 我正在尝试学习如何使用xargs 和管道..

标签: linux bash pipe


【解决方案1】:

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

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

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

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

 vi $(cat a.txt)

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

 $EDITOR $(cat a.txt)

另请阅读Advanced Bash Scripting Guide。您可以使用反引号,请参阅this answer,但我不建议使用它们。


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

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

【讨论】:

  • 为什么什么?终端被搞砸了(它有一些内部状态,由内核和终端仿真器或物理设备管理,独立于使用它的外壳或程序)。您需要将终端重置为某种合理的状态!
  • 我的意思是为什么终端会被搞砸..对不起误解..(根据您的编辑...原因很复杂?)
  • 这个答案没有回答问题。它只是解释了如何恢复到正常状态,而不是为什么它首先发生。请参阅其他答案以获取解释。
  • 我改进了我的答案。
  • script -a debug.log echo "abc" |xargs vi 并单击 Ctrl+d 以结束脚本会话 您将看到在 debug.log 中记录的 ansi 序列 ANSI 序列会弄乱您的屏幕
【解决方案2】:

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

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

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

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

PS:你可以使用:

cat file | xargs vim -Nu NONE

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

【讨论】:

【解决方案3】:

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

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

vim $(find . ...)

你可以试试:

vim $(cat a.txt)

祝你好运。 :)

【讨论】:

  • 不知道$是什么意思...能详细说明一下吗?(表示变量?)
  • 我们没有时间教你那么多。我给了你很多有用的链接。请关注并阅读它们。是的,学习 Linux 需要时间!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 2017-01-31
  • 1970-01-01
  • 2010-11-19
  • 2017-05-02
  • 2015-03-25
相关资源
最近更新 更多