佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > 從Vim中訪問shell或者運(yùn)行外部命令的方法

從Vim中訪問shell或者運(yùn)行外部命令的方法

熱門標(biāo)簽:美團(tuán) 解決方案 外呼系統(tǒng) 家政服務(wù)網(wǎng)絡(luò) 硅谷的囚徒呼叫中心 服務(wù)器配置 電話機(jī)器人搭建 百度競價(jià)點(diǎn)擊價(jià)格的計(jì)算公式

Vim——正如你可能已經(jīng)了解的那樣——是一個(gè)包含很多特性的強(qiáng)大的編輯器。我們已經(jīng)寫了好多關(guān)于 Vim 的教程,覆蓋了 基本用法、 插件, 還有一些 其他的 有用的 特性。鑒于 Vim 提供了多如海洋的特性,我們總能找到一些有用的東西來和我們的讀者分享。

在這篇教程中,我們將會(huì)重點(diǎn)關(guān)注你如何在編輯窗口執(zhí)行外部的命令,并且訪問命令行 shell。

但是在我們開始之前,很有必要提醒一下,在這篇教程中提及到的所有例子、命令行和說明,我們已經(jīng)在 Ubuntu 14.04 上測試過,我們使用的的 Vim 版本是 7.4 。

在 Vim 中執(zhí)行外部命令

有的時(shí)候,你可能需要在 Vim 編輯窗口中執(zhí)行外部的命令。例如,想象一下這種場景:你已經(jīng)在 Vim 中打開了一個(gè)文件,并做了一些修改,然后等你嘗試保存這些修改的時(shí)候,Vim 拋出一個(gè)錯(cuò)誤說你沒有足夠的權(quán)限。

現(xiàn)在,退出當(dāng)前的 vim 會(huì)話,重新使用足夠的權(quán)限打開文件將意味著你會(huì)丟失所做的所有修改,所以,你可能贊同,在大多數(shù)情況不是只有一個(gè)選擇。像這樣的情況,在編輯器內(nèi)部運(yùn)行外部命令的能力將會(huì)派上用場。

稍后我們?cè)倩貋砩厦娴挠美?,但是現(xiàn)在,讓我們了解下如何在 vim 中運(yùn)行基本的命令。

假設(shè)你在編輯一個(gè)文件,希望知道這個(gè)文件包含的行數(shù)、單詞數(shù)和字符數(shù)。為了達(dá)到這個(gè)目的,在 vim 的命令行模式下,只需要輸入冒號(hào) :,接下來一個(gè)感嘆號(hào) !,最后是要執(zhí)行的命令(這個(gè)例子中使用的是 wc)和緊接著的文件名(使用 % 表示當(dāng)前文件)。

:! wc %

這是一個(gè)例子:

填入的上面提及的命令行準(zhǔn)備執(zhí)行:

下面是終端上的輸出:

在你看到輸出之后,輸入回車鍵,你將會(huì)退回到你的 vim 會(huì)話中。

你正在編寫代碼或者腳本,并且希望盡快知道這段代碼或者腳本是否包含編譯時(shí)錯(cuò)誤或者語法錯(cuò)誤,這個(gè)時(shí)候,這種特性真的很方便。

繼續(xù),如果需求是添加輸出到文件中,使用 :read ! 命令。接下來是一個(gè)例子:

:read ! wc %

read 命令會(huì)把外部命令的輸出作為新的一行插入到編輯的文件中的當(dāng)前行的下面一行。如果你愿意,你也可以指定一個(gè)特定的行號(hào)——輸出將會(huì)添加到特定行之后。

例如,下面的命令將會(huì)在文件的第二行之后添加 wc 的輸出。

:2read ! wc %

注意: 使用 $ 在最后一行插入, 0 在第一行前面插入。

現(xiàn)在,回到最開始我們討論的一個(gè)用例,下面的命令將會(huì)幫助你保存文件而不需要先關(guān)閉文件(這將意味著沒有保存的內(nèi)容不會(huì)丟失)然后使用 sudo 命令重新打開。

:w ! sudo tee %

在 Vim 中訪問 shell

除了可以執(zhí)行單獨(dú)的命令,你也可以在 vim 中放入自己新創(chuàng)建的 shell。為了達(dá)到這種目的,在編輯器中你必須要做的是運(yùn)行以下的命令:

:shell

或者:

:sh

當(dāng)你執(zhí)行完了你的 shell 任務(wù),輸入 exit —— 這將帶你回到原來離開的 Vim 會(huì)話中。

要謹(jǐn)記的漏洞

雖然在真實(shí)世界中,能夠訪問的 shell 絕對(duì)符合它們的用戶權(quán)限,但是它也可以被用于提權(quán)技術(shù)。正如我們?cè)谠缙诘囊黄恼拢ㄔ?sudoedit 上)解釋的那樣,即使你提供給一個(gè)用戶 sudo 的權(quán)限只是通過 Vim 編輯一個(gè)文件,他們?nèi)钥梢允褂眠@項(xiàng)技術(shù)從編輯器中運(yùn)行一個(gè)新的 shell,而且他們可以做 root 用戶或者管理員用戶可以做的所有內(nèi)容。

總結(jié)

能夠在 Vim 中運(yùn)行外部命令在好多場景中(有些場景我們已經(jīng)在這篇文章中提及了)都是一個(gè)很有用的特性。這個(gè)功能的學(xué)習(xí)曲線并不麻煩,所以初學(xué)者和有經(jīng)驗(yàn)的用戶都可以好好使用它。

標(biāo)簽:防城港 北海 臨沂 邢臺(tái) 韶關(guān) 南昌 烏蘭察布 撫州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《從Vim中訪問shell或者運(yùn)行外部命令的方法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    随州市| 九龙坡区| 五莲县| 江陵县| 上杭县| 成武县| 二手房| 广安市| 兰西县| 大冶市| 葵青区| 万盛区| 阿荣旗| 龙泉市| 开江县| 容城县| 兴山县| 永善县| 略阳县| 秦安县| 成安县| 西乌珠穆沁旗| 张北县| 布尔津县| 三原县| 南木林县| 申扎县| 凤庆县| 阳东县| 兴安盟| 循化| 夹江县| 晴隆县| 鄂尔多斯市| 陇川县| 崇义县| 中牟县| 大埔县| 青川县| 钟山县| 元谋县|