Bash
當我返回 shell 時,為什麼管道文件名到 VIM 會破壞 bash?
我用 find 搜尋了一些文件,我想在 Vim 的選項卡中打開所有這些文件。所以我嘗試了這個:
find . | xargs fgrep -l myExpression | xargs vim -p
這很好用,除了當我完成並退出 Vim 時,我在 vim 中輸入的所有內容都是不可見的,並且退格鍵不起作用(所以當我像
ls<backspace><backspace>exit
結果歷史一樣輸入時ls^?^?exit
,exit
它也給了我一個警告,我的管道不是從一個終端。不過,當我重新啟動 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 {} +
,這可能被認為更優雅。