在這篇教程中,咱們將會重點關注你如何在編輯窗口執行外部的命令,而且訪問命令行 shell。html
可是在咱們開始以前,頗有必要提醒一下,在這篇教程中說起到的全部例子、命令行和說明,咱們已經在 Ubuntu 14.04 上測試過,咱們使用的的 Vim 版本是 7.4 。linux
在 Vim 中執行外部命令shell
有的時候,你可能須要在 Vim 編輯窗口中執行外部的命令。例如,想象一下這種場景:你已經在 Vim 中打開了一個文件,並作了一些修改,而後等你嘗試保存這些修改的時候,Vim 拋出一個錯誤說你沒有足夠的權限。vim
在 Vim 中執行命令行編輯器
如今,退出當前的 vim 會話,從新使用足夠的權限打開文件將意味着你會丟失所作的全部修改,因此,你可能贊同,在大多數狀況不是隻有一個選擇。像這樣的狀況,在編輯器內部運行外部命令的能力將會派上用場。學習
稍後咱們再回來上面的用例,可是如今,讓咱們瞭解下如何在 vim 中運行基本的命令。測試
假設你在編輯一個文件,但願知道這個文件包含的行數、單詞數和字符數。爲了達到這個目的,在 vim 的命令行模式下,只須要輸入冒號 :,接下來一個感嘆號 !,最後是要執行的命令(這個例子中使用的是 wc)和緊接着的文件名(使用 % 表示當前文件)。
! wc %
這是一個例子:命令行
填入的上面說起的命令行準備執行:htm
命令準備在 vim 中執行教程
下面是終端上的輸出:
命令輸出
在你看到輸出以後,輸入回車鍵,你將會退回到你的 vim 會話中。
你正在編寫代碼或者腳本,而且但願儘快知道這段代碼或者腳本是否包含編譯時錯誤或者語法錯誤,這個時候,這種特性真的很方便。
繼續,若是需求是添加輸出到文件中,使用 :read ! 命令。接下來是一個例子:
read ! wc %
read 命令會把外部命令的輸出做爲新的一行插入到編輯的文件中的當前行的下面一行。若是你願意,你也能夠指定一個特定的行號——輸出將會添加到特定行以後。
例如,下面的命令將會在文件的第二行以後添加 wc 的輸出。
read ! wc %
注意: 使用 $ 在最後一行插入, 0 在第一行前面插入。
如今,回到最開始咱們討論的一個用例,下面的命令將會幫助你保存文件而不須要先關閉文件(這將意味着沒有保存的內容不會丟失)而後使用 sudo 命令從新打開。
w ! sudo tee %
在 Vim 中訪問 shell
除了能夠執行單獨的命令,你也能夠在 vim 中放入本身新建立的 shell。爲了達到這種目的,在編輯器中你必需要作的是運行如下的命令:
shell
或者:
sh
當你執行完了你的 shell 任務,輸入 exit —— 這將帶你回到原來離開的 Vim 會話中。
要謹記的漏洞
雖然在真實世界中,可以訪問的 shell 絕對符合它們的用戶權限,可是它也能夠被用於提權技術。正如咱們在早期的一篇文章(在 sudoedit 上)解釋的那樣,即便你提供給一個用戶 sudo 的權限只是經過 Vim 編輯一個文件,他們仍可使用這項技術從編輯器中運行一個新的 shell,並且他們能夠作 root 用戶或者管理員用戶能夠作的全部內容。
總結
可以在 Vim 中運行外部命令在好多場景中(有些場景咱們已經在這篇文章中說起了)都是一個頗有用的特性。這個功能的學習曲線並不麻煩,因此初學者和有經驗的用戶均可以好好使用它。
本文地址:http://www.linuxprobe.com/vim-shell.html