如何從 Vim 中訪問 shell 或者運行外部命令
在這篇教程中,我們將會重點關注你如何在編輯窗口執行外部的命令,並且訪問命令行 shell。
但是在我們開始之前,很有必要提醒一下,在這篇教程中提及到的所有例子、命令行和說明,我們已經在 Ubuntu 14.04 上測試過,我們使用的的 Vim 版本是 7.4 。
在 Vim 中執行外部命令
有的時候,你可能需要在 Vim 編輯窗口中執行外部的命令。例如,想像一下這種場景:你已經在 Vim 中打開了一個文件,並做了一些修改,然後等你嘗試保存這些修改的時候,Vim 拋出一個錯誤說你沒有足夠的許可權。
現在,退出當前的 vim 會話,重新使用足夠的許可權打開文件將意味著你會丟失所做的所有修改,所以,你可能贊同,在大多數情況不是只有一個選擇。像這樣的情況,在編輯器內部運行外部命令的能力將會派上用場。
稍後我們再回來上面的用例,但是現在,讓我們了解下如何在 vim 中運行基本的命令。
假設你在編輯一個文件,希望知道這個文件包含的行數、單詞數和字元數。為了達到這個目的,在 vim 的命令行模式下,只需要輸入冒號 :
,接下來一個感嘆號 !
,最後是要執行的命令(這個例子中使用的是 wc
)和緊接著的文件名(使用 %
表示當前文件)。
:! wc %
這是一個例子:
填入的上面提及的命令行準備執行:
下面是終端上的輸出:
在你看到輸出之後,輸入回車鍵,你將會退回到你的 vim 會話中。
你正在編寫代碼或者腳本,並且希望儘快知道這段代碼或者腳本是否包含編譯時錯誤或者語法錯誤,這個時候,這種特性真的很方便。
繼續,如果需求是添加輸出到文件中,使用 :read !
命令。接下來是一個例子:
:read ! wc %
read
命令會把外部命令的輸出作為新的一行插入到編輯的文件中的當前行的下面一行。如果你願意,你也可以指定一個特定的行號——輸出將會添加到特定行之後。
例如,下面的命令將會在文件的第二行之後添加 wc
的輸出。
:2read ! wc %
注意: 使用 $
在最後一行插入, 0
在第一行前面插入。
現在,回到最開始我們討論的一個用例,下面的命令將會幫助你保存文件而不需要先關閉文件(這將意味著沒有保存的內容不會丟失)然後使用 sudo 命令重新打開。
:w ! sudo tee %
在 Vim 中訪問 shell
除了可以執行單獨的命令,你也可以在 vim 中放入自己新創建的 shell。為了達到這種目的,在編輯器中你必須要做的是運行以下的命令:
:shell
或者:
:sh
當你執行完了你的 shell 任務,輸入 exit
—— 這將帶你回到原來離開的 Vim 會話中。
要謹記的漏洞
雖然在真實世界中,能夠訪問的 shell 絕對符合它們的用戶許可權,但是它也可以被用於提權技術。正如我們在早期的一篇文章(在 sudoedit 上)解釋的那樣,即使你提供給一個用戶 sudo
的許可權只是通過 Vim 編輯一個文件,他們仍可以使用這項技術從編輯器中運行一個新的 shell,而且他們可以做 root
用戶或者管理員用戶可以做的所有內容。
總結
能夠在 Vim 中運行外部命令在好多場景中(有些場景我們已經在這篇文章中提及了)都是一個很有用的特性。這個功能的學習曲線並不麻煩,所以初學者和有經驗的用戶都可以好好使用它。
你現在使用這個特性有一段時間了嗎?你是否有一些東西想分享呢?請在下面的評論中留下你的想法。
via: https://www.howtoforge.com/tutorial/how-to-access-shell-or-run-external-commands-from-within-vim/
作者:Himanshu Arora 譯者:yangmingming 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive