如何從 Vim 中訪問 shell 或者執行外部命令
Vim——正如你可能已經瞭解的那樣——是一個包含很多特性的強大的編輯器。我們已經寫了好多關於 Vim 的教程,覆蓋了 、 , 還有一些 特性。鑑於 Vim 提供了多如海洋的特性,我們總能找到一些有用的東西來和我們的讀者分享。
在這篇教程中,我們將會重點關注你如何在編輯視窗執行外部的命令,並且訪問命令列 shell。
但是在我們開始之前,很有必要提醒一下,在這篇教程中提及到的所有例子、命令列和說明,我們已經在 Ubuntu 14.04 上測試過,我們使用的的 Vim 版本是 7.4 。
有的時候,你可能需要在 Vim 編輯視窗中執行外部的命令。例如,想象一下這種場景:你已經在 Vim 中開啟了一個檔案,並做了一些修改,然後等你嘗試儲存這些修改的時候,Vim 丟擲一個錯誤說你沒有足夠的許可權。
現在,退出當前的 vim 會話,重新使用足夠的許可權開啟檔案將意味著你會丟失所做的所有修改,所以,你可能贊同,在大多數情況不是隻有一個選擇。像這樣的情況,在編輯器內部執行外部命令的能力將會派上用場。
稍後我們再回來上面的用例,但是現在,讓我們瞭解下如何在 vim 中執行基本的命令。
假設你在編輯一個檔案,希望知道這個檔案包含的行數、單詞數和字元數。為了達到這個目的,在 vim 的命令列模式下,只需要輸入冒號 :
,接下來一個感嘆號 !
,最後是要執行的命令(這個例子中使用的是 wc
)和緊接著的檔名(使用 %
表示當前檔案)。
:! wc %
這是一個例子:
填入的上面提及的命令列準備執行:
下面是終端上的輸出:
在你看到輸出之後,輸入Enter鍵,你將會退回到你的 vim 會話中。
你正在編寫程式碼或者指令碼,並且希望儘快知道這段程式碼或者指令碼是否包含編譯時錯誤或者語法錯誤,這個時候,這種特性真的很方便。
繼續,如果需求是新增輸出到檔案中,使用 :read !
命令。接下來是一個例子:
:read ! wc %
read
命令會把外部命令的輸出作為新的一行插入到編輯的檔案中的當前行的下面一行。如果你願意,你也可以指定一個特定的行號——輸出將會新增到特定行之後。
例如,下面的命令將會在檔案的第二行之後新增 wc
的輸出。
:2read ! wc %
注意: 使用 $
在最後一行插入, 0
在第一行前面插入。
現在,回到最開始我們討論的一個用例,下面的命令將會幫助你儲存檔案而不需要先關閉檔案(這將意味著沒有儲存的內容不會丟失)然後使用 命令重新開啟。
:w ! sudo tee %
除了可以執行單獨的命令,你也可以在 vim 中放入自己新建立的 shell。為了達到這種目的,在編輯器中你必須要做的是執行以下的命令:
:shell
或者:
:sh
當你執行完了你的 shell 任務,輸入 exit
—— 這將帶你回到原來離開的 Vim 會話中。
雖然在真實世界中,能夠訪問的 shell 絕對符合它們的使用者許可權,但是它也可以被用於提權技術。正如我們在早期的一篇文章(在 sudoedit 上)解釋的那樣,即使你提供給一個使用者 sudo
的許可權只是透過 Vim 編輯一個檔案,他們仍可以使用這項技術從編輯器中執行一個新的 shell,而且他們可以做 root
使用者或者管理員使用者可以做的所有內容。
能夠在 Vim 中執行外部命令在好多場景中(有些場景我們已經在這篇文章中提及了)都是一個很有用的特性。這個功能的學習曲線並不麻煩,所以初學者和有經驗的使用者都可以好好使用它。
你現在使用這個特性有一段時間了嗎?你是否有一些東西想分享呢?請在下面的評論中留下你的想法。
譯文出處:
via:
作者: 譯者: 校對:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/855/viewspace-2814993/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux中vim和shellLinux
- docker 中vim 命令 無法執行Docker
- 如何訪問 Mac 下用 HyperKit 執行的 Docker VM?MacDocker
- python中shell執行知識點Python
- 從標準輸入流中讀取並執行shell指定函式函式
- 執行 shell 指令碼 \r 問題解決指令碼
- NODE_ENV 不是內部或外部命令,也不是可執行的程式,或者批處理檔案
- anaconda中執行pip命令顯示不是內部或外部命令
- 執行shell指令碼指令碼
- shell後臺執行
- 如何從公網訪問內網Django內網Django
- [20190126]從sqlplus執行結果返回bash shell變數.txtSQL變數
- pytorch中’tensorboard‘不是內部或外部命令,也不是可執行的程式PyTorchORB
- 在 Ruby 中執行 Shell 命令的 6 種方法
- 什麼是身份和訪問管理策略,企業如何從中受益?
- 如何從外網訪問本地WEB應用?Web
- c#基礎,單執行緒,跨執行緒訪問和執行緒帶引數C#執行緒
- vue執行後network的IP地址訪問不了Vue
- springboot 專案引入tk或者jpa 訪問報錯Spring Boot
- 如何讓shell指令碼變成可執行檔案指令碼
- 說說Linux shell外部命令與內建命令Linux
- shell中的source和直接執行sh的區別
- Linux中執行Shell指令碼的方式(三種方法)Linux指令碼
- Linux shell:執行shell指令碼的幾種方式Linux指令碼
- 如何從外網訪問內網Linux系統?內網Linux
- FastReport VCL如何從程式碼訪問報告物件AST物件
- 資料訪問連線池和執行緒池執行緒
- Nginx執行控制虛擬主機和訪問控制Nginx
- 使用 Vim 管理任務列表和訪問 Reddit 和 Twitter
- shell執行小數運算
- bash shell多執行緒方案執行緒
- 在Linux中,如何使用shell指令碼判斷某個服務是否正在執行?Linux指令碼
- C# WinForm 執行緒間操作無效: 從不是建立控制元件的執行緒訪問它的解決辦法C#ORM執行緒控制元件
- 教你如何進行SSH無密碼訪問密碼
- 從FMDB執行緒安全問題說起執行緒
- 如何在Mac字型中訪問特殊字元Mac字元
- python如何訪問元組中的元素Python
- Springboot中如何訪問靜態資源Spring Boot