首先明白為什麼不能在vim中使用alias是有好處的。程序要執行乙個命令只能依靠系統函式execve(在它之前可能要先呼叫fork函式),它的函式宣告如下:
int execve(const char *filename, const char *argv, const char *envp);
execve只識別檔名,bash之所以能夠識別alias,是因為在呼叫execve之前它已經將alias展開了,這有點類似c語言的巨集。alias為bash所獨有,vim無法識別,類似地,其它外部命令也識別不了。這樣我們就很容易理解為什麼xargs、find、sudo等命令中不能使用alias了,卻可以在管道中使用。舉個例子:
alias grep='grep -i --color=auto'
find . -name '*.py' -exec grep 'class' '{}' \;
find . -name '*.py' | grep hello
第一條命令定義了grep的alias,第二條命令執行find,它同時呼叫grep命令,由於find屬於外部命令,它只能執行外部的grep命令,而不是在第一條命令中定義的alias。第三條命令包含管道,管道實際上是個復合命令,它包含兩個子命令,分別是find和grep,均由bash執行,在執行之前會先擴充套件每條命令,所以這裡執行的grep就是第一條命令中擴充套件後的alias,整條命令相當於執行:
find . -name '*.py' | command grep -i --color=auto
簡單地說,只有bash才知道alias,所以在外部(vim, find, xargs中)執行alias的唯一方法就是通過bash去執行。
bash -ic 'your alias'
-c選項表示從引數中讀取命令,而不是向通常那樣從檔案中讀取。-i表示在互動模式下執行,只有在互動模式下才會擴充套件alias。bash分為互動模式和非互動模式,通常我們開啟乙個bash進入是互動模式,會有一命令提示符等待使用者輸入,使用者從鍵盤輸入(或者重定向從檔案讀入),然後bash執行使用者命令,將結果輸入至標準輸出,執行完畢又顯示提示符等待使用者輸入,這是互動模式。執行指令碼時執行的是非互動模式,例如"bash hello.sh",在hello.sh中命令是在非互動模式下執行的,這時不會擴充套件alias,可以用選項-i將它切換到互動模式下。所以指令碼在一般情況下是不會擴充套件alias的,除非你在執行時指定了-i選項,這麼做的原因很明顯,因為alias是非常個性化,而指令碼卻希望在所有機器上的行為表現一致,如果你剛好alias了系統指令碼中的某條命令,那麼這個指令碼可能就會執行不正常。在vim中執行alias其實還有乙個簡單的方法,就是設定shellcmdflag選項:
:set shellcmdflag=-ic
這樣就可以直接使用':!your_alias'來執行bash alias了。
在vim中執行shell指令
簡介 1.進入 shell 1 在 vim 中執行 shell或 sh,當退出當前 shell 時,就會回到 vim 2 也可以使用ctr z進入 shell,然後執行fg回到 vim。上述功能可用於下述場景 如我們編輯了乙個檔案,但是發現無法儲存 沒有寫許可權 你可以先改變該檔案讀寫許可權,然後再...
在vim中執行shell命令或者開啟bash
command 特別的可以執行 bash來啟動乙個bash shell並執行命令,不需要退出vim r command r date 讀取系統時間並插入到當前行的下一行。起始行號 結束行號 command 62,72 sort 將62行到72行的內容進行排序,也可以只指定一行當前游標所在行,除可以指...
vim中執行shell命令
1.在使用vim的過程中,不退出vim執行shell命令,直接在命令模式下面輸入感嘆號 和要執行的命令即可。例如 執行ls命令,則直接輸入 ls即可 2.在命令列中,百分號 是特殊字元,為檔案的路徑名稱,比如我們當前編輯的python指令碼,我們可以不退出vim直接執行它。3.在vim中直接在命令列...