Vim: Warning: input is not from a terminal 后退出 vim 终端异常

2023-05-16

Vim: Warning: input is not from a terminal 后退出 vim 终端异常

今天执行了如下命令调用 vi 来打开 find 搜索到的文件:

longyu@longyu-pc:~$ find ./ -name 'linux-kernel-ixgbe-commit-log'  | xargs vi 

执行了上述命令之后,Vim 打印了下面的警告信息:

Vim: Warning: Input is not from a terminal

没理会这个警告,退出 vim 后,发现终端异常,输入的字符不能正常显示,按 enter 换行也不正确。
具体的现象如下:

longyu@longyu-pc:~$ longyu@longyu-pc:~$ longyu@longyu-pc:~$ longyu@longyu-pc:~$ 

问题分析

出了问题之后,之前提到的那个警告需要重视一下。在网上搜索,发现了如下链接:

invoking vi through find xargs breaks my terminal Why

通过阅读上述链接上的问题,我发现这个问题是 xargs 将 stdin 映射为 /dev/null 导致的。按照上述链接中的回答,我在终端中执行如下命令:

	true | xargs filan -s 

执行后报 filan 命令找不到的错误。直接 sudo apt-get install filan没有找到相关包,搜索发现 filan 是在 socat 包中包含的命令。执行 sudo apt-get install socat命令之后,filan 命令可以使用了。

filan -h了解到 filan 命令是用来分析进程的文件描述符信息的程序。再次执行 true | xargs filan -s
命令,有如下输出信息:

longyu@longyu-pc:~$ true | xargs filan -s
    0 chrdev /dev/null
    1 tty /dev/pts/3
    2 tty /dev/pts/3
    3 unixdatagram <anon>
    4 unixdatagram <anon>

从上面的输出中可以确定 xargs 程序将 stdin 映射到了 /dev/null 上。进一步的了解发现 xargs 支持 -o 选项,可以在执行子进程命令之前重新将 stdin 映射到 /dev/tty 上,这个功能可以用在使用 xargs 调用交互式程序的情况下。

man xargs 中相关的内容如下:

  -o, --open-tty
              Reopen  stdin as /dev/tty in the child process before executing the command.  This is useful if you want xargs to run an interactive appli‐
              cation.

指定 -o 参数再次执行 filan -s 命令,有如下输出:

longyu@longyu-pc:~$ true | xargs -o filan -s
    0 tty /dev/tty
    1 tty /dev/pts/3
    2 tty /dev/pts/3
    3 unixdatagram <anon>
    4 unixdatagram <anon>

从上面的输出中可以确定,stdin 被映射到了 /dev/tty 上。

如何将终端恢复正常

最开始,我直接关闭终端,然后重新开了一个新的终端就解决了问题。其实我可以通过执行 stty sane命令来将终端恢复正常。(注意输入命令并不回显)

man stty 发现 sane 选项会将所有特殊字符恢复默认值,这与正常工作过程中终端的特殊字符配置可能不相同。在我系统中,正常的终端特殊字符配置如下:

longyu@longyu-pc:~$ stty
speed 38400 baud; line = 0;
-brkint -imaxbel

直接使用 xargs 调用一次 vi 然后通过执行 stty sane 来恢复默认终端配置,这之后的特殊字符配置信息如下:

longyu@longyu-pc:~$ stty
speed 0 baud; line = 0;

通过对比可以发现,调用 stty sane 之后,一些终端配置失效了。

最终的解决方案

不要通过 xargs 直接调用交互式程序。非要通过 xargs 来调用交互式程序的话,指定 xargs 的 -o 参数在调用交互式命令执行前将 stdin 重新映射为 /dev/tty。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vim: Warning: input is not from a terminal 后退出 vim 终端异常 的相关文章

随机推荐

  • 创建表时附带的ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic 的解释

    ENGINE 61 InnoDB DEFAULT CHARSET 61 utf8 COLLATE 61 utf8 general ci ROW FORMAT的解释 1 示例 CREATE TABLE 96 student 96 96 id
  • c语言编程“水仙花数”

    文章目录 打印所有的水仙花数 所谓的 水仙花数 是指一个三位数 xff0c 其各位数字的立方和等于该数本身 例如 xff0c 153是水仙花数 xff0c 因为153 61 1 3 43 5 3 43 3 3 打印所有的水仙花数 所谓的 水
  • inux查看日志的几种方法

    linux 日志查看 tail head cat tac sed less echo 1 命令格式 tail 必要参数 选择参数 文件 f 循环读取 q 不显示处理信息 v 显示详细的处理信息 c lt 数目 gt 显示的字节数 n lt
  • asp不能正常用的原因

    前几天做网站时 xff0c 机子出现了这种症状 xff0c 重装过IE和IIS一样也无法解决 xff0c 在百度里找了一下 xff0c 下面的方法真的很适用 症状 xff1a 运行asp程序 包括其他动态网页程序 出现500内部错误信息 x
  • 用DLL实现把数据库的记录导出到EXCEL中(VB)

    39 新建一个ActiveX DLL工程工程名为DbToExcel 39 工程 gt 引用 引用Microsoft ActiveX Data Objects 2 6 Library 39 Microsoft Excel 9 0 Object
  • MySQL转换为SqlServer数据库

    如何将MySQL数据导入到SqlServer中 xff0c 请看以下步骤 xff1a 1 安装mysql数据库的ODBC驱动 xff0c mysql connector odbc 3 51 19 win32 msi 2 打开控制面板管理工具
  • DataTimePicker数据绑定遇到Null时异常的原因

    DateTimePicker1 DataBindings Add 34 Value 34 bindingSource1 34 assessortime 34 如果字段 assessortime的值 为 null 时 就会出现异常 后来发现
  • c#中DataTable与实体集合相互转换

    以下是将集合类转换成DataTable lt summary gt 将集合类转换成DataTable lt summary gt lt param name 61 34 list 34 gt 集合 lt param gt lt return
  • 用Linux命令行生成随机密码的十种方法

    转载自 极客范 xff0c 不得不夸夸强大的Bash啊 xff01 xff01 xff01 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • C++20 Ranges

    VS2019 C 43 43 20的Ranges 01 引入范围的动机02 范围 ranges 03 range v3库04 C 43 43 20 range demo 01 引入范围的动机 C 43 43 17以前的标准库中大多数通用算法
  • 面向对象分析设计步骤

    一 创建用例 初步确定用例 xff1a 1 确定参与者 2 确定用例 xff08 系统操作 xff09 3 确定参与者与用例之间的关系 用例细节描述 xff1a 1 用例名称 2 操作详细描述 3 前置条件描述 4 部署约束 5 正常事件流
  • collect2: ld terminated with signal 9 错误解决办法

    编译android是出现如下错误 xff1a target Java CameraEffectsTests out target common obj APPS CameraEffectsTests intermediates classe
  • 浅谈Stein算法求最大公约数(GCD)的原理及简单应用

    一 Stein算法过程及其简单证明 1 一般步骤 xff1a s1 当两数均为偶数时将其同时除以2至至少一数为奇数为止 xff0c 记录除掉的所有公因数2的乘积k xff1b s2 如果仍有一数为偶数 xff0c 连续除以2直至该数为奇数为
  • 【已解决】@Configration爆红

    64 Configration爆红 问题原因 xff1a 一 xff1a 没有添加依赖 二 xff1a 添加依赖了 xff0c 但是依赖版本过低 解决方法 xff1a 把依赖的版本改的高一点 span class token generic
  • 关于冒泡排序的程序( 第三次作业)

    此前想过把两种排序方式都一起写在一个工程文件里 xff0c 但做了下 xff0c 能力有限 xff0c 没法写完整 xff0c 所以就只能分别写 xff0c 这个是冒泡排序 xff0c 代码已尽量做到准确的注释 xff0c 希望提醒自己往后
  • BSS段

    深入理解计算机系统 bss段 xff0c data段 text段 堆 heap 和栈 stack 1 关于BSS段的大小 2 1 BSS段中的内容 2 2 BSS段在加载运行前的处理 3 3 BSS段的作用 3 4 代码优化对BSS段的影响
  • Java 比较两个List对象差集(根据某一值)

    很多都是比较List lt String gt 的 xff0c 和自身业务不符 xff0c jdk1 8 新特性强大的Stream API xff0c 具体是什么方法 xff0c 什么作用自行百度 xff0c 复制粘贴可以解决问题就OK 4
  • Windows10 安装Redis(图文教程)

    Redis xff08 Remote Dictionary Server xff0c 即远程字典服务 xff0c 是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 一 下载redis客户
  • e17 enlightenment 介绍及配置

    为什么要有一个窗口管理器 为什么一定要有一个桌面背景 xff0c 甚至是标题栏 或是如果把一个应用程序如firefox当成桌面背景行不行 桌面能不能再快一点 我不想把资源浪费在那些用不到的地方 Linux那么多虚拟桌面 xff0c 为什么我
  • Vim: Warning: input is not from a terminal 后退出 vim 终端异常

    Vim Warning input is not from a terminal 后退出 vim 终端异常 今天执行了如下命令调用 vi 来打开 find 搜索到的文件 xff1a longyu 64 longyu pc span clas