Bash 在完成grep并将其传递给vim之后,为什么我会遇到这种奇怪的控制台故障?

Bash 在完成grep并将其传递给vim之后,为什么我会遇到这种奇怪的控制台故障?,bash,vim,console,ssh,grep,Bash,Vim,Console,Ssh,Grep,我刚才试过这个: grep -RlI "id=\"kw\"" * | xargs vim 这给了我16个结果。它在Vim中打开了第一个结果。我第一次编辑并点击:q,因为我不知道跳转到下一个文件的快捷方式 它把我扔回了控制台,我被塞进了服务器。我的控制台现在坏了。我键入的任何内容我都看不到,而且每当我按enter键时,它似乎会处理命令,但显示/视图被搞得一团糟 [meder@linode]在我的控制台上有标签,至少有一半。重置没有任何作用,因为它似乎把我真正的控制台搞砸了 有人能提供一个没有同样

我刚才试过这个:

grep -RlI "id=\"kw\"" * | xargs vim
这给了我16个结果。它在Vim中打开了第一个结果。我第一次编辑并点击:q,因为我不知道跳转到下一个文件的快捷方式

它把我扔回了控制台,我被塞进了服务器。我的控制台现在坏了。我键入的任何内容我都看不到,而且每当我按enter键时,它似乎会处理命令,但显示/视图被搞得一团糟

[meder@linode]在我的控制台上有标签,至少有一半。重置没有任何作用,因为它似乎把我真正的控制台搞砸了

有人能提供一个没有同样缺点的解决方案吗?或者有人能解释为什么:第一个文件中的qing把我的控制台搞砸了

背景信息:我的电脑是Debian Ubuntu,我被放在RHEL盒子里。我打开的文件是text/ascii文件phtml/php文件,而不是一些奇怪的带有疯狂字符的二进制文件

下面是所发生的事情的一个例子

编辑1:我刚刚再次输入了reset,它似乎起作用了。我认为第一次重置不起作用,因为控制台不知怎么在里面插入了一些空白字符?无论如何,我想解释一下这种奇怪的行为。

您可以使用:next或:n进入下一个要编辑的文件。您还可以使用vim-o在vim的不同窗口中打开所有匹配的文件

不知道为什么你的主机会出问题。我尝试使用您的命令,我的控制台很好。

您可以使用:next或:n进入下一个要编辑的文件。您还可以使用vim-o在vim的不同窗口中打开所有匹配的文件

不知道为什么你的主机会出问题。我尝试使用您的命令,我的控制台很好。

来自xargs的手册页:

这一行不在Linux手册页中,但它出现在我的Mac上。如果要运行要读取标准输入的程序,通常linux版本的xargs将需要一个参数来从文件读取其输入:

   OPTIONS
       --arg-file=file, -a file
              Read items from file instead of standard input.
              If you use this option, stdin remains unchanged
              when commands are run.  Otherwise, stdin is
              redirected from /dev/null.
Vim打算在标准输入和标准输出都连接到真实的情况下运行,这是目前非常罕见的情况或伪tty设备。如果你打乱了这个安排,将会发生更多的事情

命令的根本问题是,当标准输入重定向到管道时,xargs无法使用正常的标准输入运行vim。因此,vim模式更改和命令输入不是您所期望的

您可能可以通过键入return、tilde和句点来修复此问题。这将迫使您的ssh会话从您的终端关闭,然后您可以再次ssh,并运行ps检查后台是否有任何挂起的内容,您应该关闭这些内容。

来自xargs的手册页:

这一行不在Linux手册页中,但它出现在我的Mac上。如果要运行要读取标准输入的程序,通常linux版本的xargs将需要一个参数来从文件读取其输入:

   OPTIONS
       --arg-file=file, -a file
              Read items from file instead of standard input.
              If you use this option, stdin remains unchanged
              when commands are run.  Otherwise, stdin is
              redirected from /dev/null.
Vim打算在标准输入和标准输出都连接到真实的情况下运行,这是目前非常罕见的情况或伪tty设备。如果你打乱了这个安排,将会发生更多的事情

命令的根本问题是,当标准输入重定向到管道时,xargs无法使用正常的标准输入运行vim。因此,vim模式更改和命令输入不是您所期望的

您可能可以通过键入return、tilde和句点来修复此问题。这将迫使您的ssh会话从您的终端关闭,然后您可以再次使用ssh,并运行ps检查后台是否有任何挂起的内容,您应该停止这些内容。

尝试:

vim -o `grep -RlI "id=\"kw\"" * `
尝试:


控制台选项由stty设置,因此您可能希望将其选项保存到bash变量,并在vim退出后恢复它们,如下所示:

function vim()
{
    STTYOPTS="$(stty --save)"
    vim "$@"
    stty "${STTYOPTS}"
}

但对于这个任务来说,使用zsh可能是更好的方法:如果您在~/.zshrc中放入唯一的一行ttyctl-f,那么zsh将在程序退出后自动恢复终端选项。ttyctl是一个内置的zsh,因此您不能从bash使用它。

控制台选项由stty设置,因此您可能希望将其选项保存到bash变量,并在vim退出后恢复它们,如下所示:

function vim()
{
    STTYOPTS="$(stty --save)"
    vim "$@"
    stty "${STTYOPTS}"
}

但对于这个任务来说,使用zsh可能是更好的方法:如果您在~/.zshrc中放入唯一的一行ttyctl-f,那么zsh将在程序退出后自动恢复终端选项。ttyctl是zsh内置的,因此您不能从bash使用它。

其他人介绍了发生的事情以及如何处理它。至于原因,答案可能在于Vim从xargs命令接收到了什么输入,并试图像来自终端一样执行该输入。我不知道如何和终端通话,但你们可以想象,Vim收到一些奇怪的命令,使它崩溃或让它退出。类似地,当您对二进制文件进行cat时,也会发生不可预知的事情

安威,我有另一个主意。您是否尝试过使用vimgrep浏览 匹配模式的文件列表

:vimgrep /id="kw"/ *
:copen
此选项表示当前目录中所有文件的id=kw:copen打开一个包含匹配项列表的窗口。您可以浏览该列表,单击enter键跳转到文件位置

有关详细信息,请参阅

:help grep
:help :vimgrep
:help :copen
:help quickfix
如果您真的需要-I选项,请参阅

:help :grep
:help 'grepprg'

另请参见:

其他人讲述了发生的事情以及如何处理。至于原因,答案可能在于Vim从xargs命令接收到了什么输入,并试图像来自终端一样执行该输入。我不知道如何和终端通话,但你们可以想象,Vim收到一些奇怪的命令,使它崩溃或让它退出。类似地,当您对二进制文件进行cat时,也会发生不可预知的事情

安威,我有另一个主意。您是否尝试过使用vimgrep浏览与模式匹配的文件列表

:vimgrep /id="kw"/ *
:copen
此选项表示当前目录中所有文件的id=kw:copen打开一个包含匹配项列表的窗口。您可以浏览该列表,单击enter键跳转到文件位置

有关详细信息,请参阅

:help grep
:help :vimgrep
:help :copen
:help quickfix
如果您真的需要-I选项,请参阅

:help :grep
:help 'grepprg'
另请参见:

尝试使用…|然后从控制终端设备/dev/tty读取

试着用…|然后从控制终端设备/dev/tty读取


可能重复:@noodl-我在I:q之后遇到了一个问题,而这个问题中没有。很抱歉这两个愚蠢的评论。你试过清除命令了吗?我打了两次后重置成功了。我想知道为什么会发生这种情况。可能是因为不必要的不可见符号,如\t和其他=可能重复:@noodl-我在I:q之后遇到了一个问题,而这个问题中没有。很抱歉这两个愚蠢的评论。你试过清除命令了吗?我打了两次后重置成功了。我想知道为什么会发生这种情况。可能是因为不必要的不可见符号,如\t和其他=我只是做了vim-o,因为所有这些文件都在一个vim实例中打开,所以在完成之前我不必:q。但是在我完成之后,同样的问题出现了,我只是做了vim-o,因为所有这些文件都在一个vim实例中打开,所以在我完成之前,我不必:q。在我完成之后,同样的问题也出现了。这个命令可以工作,尽管它为grep在使用-o选项时返回的文件创建了一组窗口。这对于3或4个文件很有用,但是当我运行搜索时返回了22个文件,这似乎不太好用。因此,我刚刚删除了-o,现在vim按顺序打开所有文件:这个命令可以工作,尽管它为grep在使用-o选项时返回的文件创建了一组窗口。这对于3或4个文件很有用,但是当我运行搜索时返回了22个文件,这似乎不太好用。所以我刚刚删除了-o,现在vim按顺序打开所有文件: