Bash

當我返回 shell 時,為什麼管道文件名到 VIM 會破壞 bash?

  • January 29, 2016

我用 find 搜尋了一些文件,我想在 Vim 的選項卡中打開所有這些文件。所以我嘗試了這個:

find . | xargs fgrep -l myExpression | xargs vim -p

這很好用,除了當我完成並退出 Vim 時,我在 vim 中輸入的所有內容都是不可見的,並且退格鍵不起作用(所以當我像ls<backspace><backspace>exit結果歷史一樣輸入時ls^?^?exitexit它也給了我一個警告,我的管道不是從一個終端。

不過,當我重新啟動 shell 時,一切都恢復了。這總是可以重現的。

重擊版本:

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

Vim 版本:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 14 2015 05:43:37)
Included patches: 1-699

命令行程序可以通過兩個來源從使用者那裡獲取輸入:從標準輸入(您要通過管道傳輸到)和直接附加到 TTY。當這些混合在一起時,可能會發生壞事。Vim 不想從管道中讀取輸入,它需要你,使用者,直接。所以讓我們把真正的標準輸入還給它。

作為一種解決方案,我們可以使用命令替換直接將文件作為參數傳遞給 Vim:

vim -p $(find . | xargs fgrep -l myExpression)

請注意,由於 shell 執行的擴展,這將無法正確處理名稱中帶有空格的文件,但是我的 Bash-fu 太弱了,無法輕鬆解決。

此外,find options | xargs some command可以寫成find options -exec some command {} +,這可能被認為更優雅。

引用自:https://unix.stackexchange.com/questions/258630