linux - 为什么 "cat a.txt | xargs vi"会破坏 bash?

标签 linux bash pipe

<分区>

a.txt 的内容:ba.txt

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

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

bash

有人能解释一下吗?

最佳答案

您的 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 年代,我十几岁的时候就从事过一些工作。这是一种令人难以置信的有趣和嘈杂 - 一种机电通信打字机。

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

关于linux - 为什么 "cat a.txt | xargs vi"会破坏 bash?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717623/

相关文章:

linux - 停止 aplaymidi 留下卡住的音符

c++ - 在 Mac OS X 上使用 EWS SDK Linux 加载 ecw 文件 -> 错误链接符号

arrays - 在 jq 中基于另一个数组获取数组

linux - 如何在 bash shell 脚本中使用表中的命令结果值

linux - 如何处理包含有问题(= shell 元和空格)字符的路径名?

c - 如何在不停止 C 中的父进程的情况下 fork 子进程

php - 在 Linux 上使用 php 连接访问 97

ruby-on-rails - 扩展 Ruby on Rails 站点

c - 使用 popen() 将密码传递到 Veracrypt - 安全吗?

postgresql - 命令StdinPipe关闭太早