婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > Linux環(huán)境下VI/VIM編輯文件時(shí)無(wú)權(quán)限保存的解決方法(普通用戶)

Linux環(huán)境下VI/VIM編輯文件時(shí)無(wú)權(quán)限保存的解決方法(普通用戶)

熱門(mén)標(biāo)簽:地圖標(biāo)注行業(yè)發(fā)展如何 中山ai電銷機(jī)器人招商 河南400電話如何辦理 寧波電信400電話辦理 電銷機(jī)器人賺錢(qián)思路 太原地圖標(biāo)注推廣員 怎么坐地圖標(biāo)注 疏附縣地圖標(biāo)注 河南營(yíng)銷智能外呼系統(tǒng)價(jià)格多少

在Linux環(huán)境下,如果直接使用VI/VIM命令編輯沒(méi)有修改權(quán)限的文件時(shí),保存的時(shí)候就會(huì)提示用戶無(wú)法進(jìn)行保存操作,一般的解決方法只能是關(guān)閉文件重新以sudo權(quán)限打開(kāi)該文件編輯后再保存(前提是用戶具有sudo權(quán)限)。其實(shí),在VI/VIM模式下通過(guò)一些簡(jiǎn)單的命令,就能在不關(guān)閉當(dāng)前文件的情況下達(dá)到保存文件的目的。

方法一

關(guān)于%! sudo tee % > /dev/null這條命令的說(shuō)明如下

此命令是把當(dāng)前文件(即%)作為stdin傳給sudo tee命令來(lái)執(zhí)行。

方法二
 

在Linux上工作的朋友很可能遇到過(guò)這樣一種情況,當(dāng)你用Vim編輯完一個(gè)文件時(shí),運(yùn)行:wq保存退出,突然蹦出一個(gè)錯(cuò)誤:

E45: 'readonly' option is set (add ! to override)

這表明文件是只讀的,按照提示,加上!強(qiáng)制保存::w!,結(jié)果又一個(gè)錯(cuò)誤出現(xiàn):

"readonly-file-name" E212: Can't open file for writing

文件明明存在,為何提示無(wú)法打開(kāi)?這錯(cuò)誤又代表什么呢?查看文檔:help E212:

For some reason the file you are writing to cannot be created or overwritten.
The reason could be that you do not have permission to write in the directory
or the file name is not valid.

原來(lái)是可能沒(méi)有權(quán)限造成的。此時(shí)你才想起,這個(gè)文件需要root權(quán)限才能編輯,而當(dāng)前登陸的只是普通用戶,在編輯之前你忘了使用sudo來(lái)啟動(dòng)Vim,所以才保存失敗。于是為了防止修改丟失,你只好先把它保存為另外一個(gè)臨時(shí)文件temp-file-name,然后退出Vim,再運(yùn)行sudo mv temp-file-name readonly-file-name覆蓋原文件。

但這樣操作過(guò)于繁瑣。而且如果只是想暫存此文件,還需要接著修改,則希望保留Vim的工作狀態(tài),比如編輯歷史,buffer狀態(tài)等等,該怎么辦?能不能在不退出Vim的情況下獲得root權(quán)限來(lái)保存這個(gè)文件?

解決方案

答案是可以,執(zhí)行這樣一條命令即可:

:w !sudo tee %

接下來(lái)我們來(lái)分析這個(gè)命令為什么可以工作。首先查看文檔:help :w,向下滾動(dòng)一點(diǎn)可以看到:

	*:w_c* *:write_c*
:[range]w[rite] [++opt] !{cmd}
			Execute {cmd} with [range] lines as standard input
			(note the space in front of the '!').  {cmd} is
			executed like with ":!{cmd}", any '!' is replaced with
			the previous command |:!|.

The default [range] for the ":w" command is the whole buffer (1,$)

把這個(gè)使用方法對(duì)應(yīng)前面的命令,如下所示:

:       w               !sudo tee %
|       |               |  |
:[range]w[rite] [++opt] !{cmd}

我們并未指定range,參見(jiàn)幫助文檔最下面一行,當(dāng)range未指定時(shí),默認(rèn)情況下是整個(gè)文件。此外,這里也沒(méi)有指定opt。

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

接下來(lái)是一個(gè)嘆號(hào)!,它表示其后面部分是外部命令,即sudo tee %。文檔中說(shuō)的很清楚,這和直接執(zhí)行:!{cmd}是一樣的效果。后者的作用是打開(kāi)shell執(zhí)行一個(gè)命令,比如,運(yùn)行:!ls,會(huì)顯示當(dāng)前工作目錄下的所有文件,這非常有用,任何可以在shell中執(zhí)行的命令都可以在不退出Vim的情況下運(yùn)行,并且可以將結(jié)果讀入到Vim中來(lái)。試想,如果你要在Vim中插入當(dāng)前工作路徑或者當(dāng)前工作路徑下的所有文件名,你可以運(yùn)行:

:r !pwd或:r !ls

此時(shí)所有的內(nèi)容便被讀入至Vim,而不需要退出Vim,執(zhí)行命令,然后拷貝粘貼至Vim中。有了它,Vim可以自由的操作shell而無(wú)需退出。

命令的另一種表示形式

再看前面的文檔:

Execute {cmd} with [range] lines as standard input

所以實(shí)際上這個(gè):w并未真的保存當(dāng)前文件,就像執(zhí)行:w new-file-name時(shí),它將當(dāng)前文件的內(nèi)容保存到另外一個(gè)new-file-name的文件中,在這里它相當(dāng)于一個(gè)另存為,而不是保存。它將當(dāng)前文檔的內(nèi)容寫(xiě)到后面cmd的標(biāo)準(zhǔn)輸入中,再來(lái)執(zhí)行cmd,所以整個(gè)命令可以轉(zhuǎn)換為一個(gè)具有相同功能的普通shell命令:

$ cat readonly-file-name | sudo tee %

這樣看起來(lái)”正常”些了。其中sudo很好理解,意為切換至root執(zhí)行后面的命令,tee和%是什么呢?

%的意義

我們先來(lái)看%,執(zhí)行:help cmdline-special可以看到:

In Ex commands, at places where a file name can be used, the following
characters have a special meaning. These can also be used in the expression
function expand() |expand()|.
% Is replaced with the current file name. *:_%* *c_%*

在執(zhí)行外部命令時(shí),%會(huì)擴(kuò)展成當(dāng)前文件名,所以上述的cmd也就成了sudo tee readonly-file-name。此時(shí)整個(gè)命令即:

$ cat readonly-file-name | sudo tee readonly-file-name

注意:在另外一個(gè)地方我們也經(jīng)常用到%,沒(méi)錯(cuò),替換。但是那里%的作用不一樣,執(zhí)行:help :%查看文檔:

Line numbers may be specified with: *:range* *E14* *{address}*
{number} an absolute line number
...
% equal to 1,$ (the entire file) *:%*

在替換中,%的意義是代表整個(gè)文件,而不是文件名。所以對(duì)于命令:%s/old/new/g,它表示的是替換整篇文檔中的old為new,而不是把文件名中的old換成new。

tee的作用

現(xiàn)在只剩一個(gè)難點(diǎn): tee。它究竟有何用?維基百科上對(duì)其有一個(gè)詳細(xì)的解釋,你也可以查看man page。下面這幅圖很形象的展示了tee是如何工作的:

ls -l的輸出經(jīng)過(guò)管道傳給了tee,后者做了兩件事,首先拷貝一份數(shù)據(jù)到文件file.txt,同時(shí)再拷貝一份到其標(biāo)準(zhǔn)輸出。數(shù)據(jù)再次經(jīng)過(guò)管道傳給less的標(biāo)準(zhǔn)輸入,所以它在不影響原有管道的基礎(chǔ)上對(duì)數(shù)據(jù)作了一份拷貝并保存到文件中。看上圖中間部分,它很像大寫(xiě)的字母T,給數(shù)據(jù)流動(dòng)增加了一個(gè)分支,tee的名字也由此而來(lái)。

現(xiàn)在上面的命令就容易理解了,tee將其標(biāo)準(zhǔn)輸入中的內(nèi)容寫(xiě)到了readonly-file-name中,從而達(dá)到了更新只讀文件的目的。當(dāng)然這里其實(shí)還有另外一半數(shù)據(jù):tee的標(biāo)準(zhǔn)輸出,但因?yàn)楹竺鏇](méi)有跟其它的命令,所以這份輸出相當(dāng)于被拋棄。當(dāng)然也可以在后面補(bǔ)上> /dev/null,以顯式的丟棄標(biāo)準(zhǔn)輸出,但是這對(duì)整個(gè)操作沒(méi)有影響,而且會(huì)增加輸入的字符數(shù),因此只需上述命令即可。

命令執(zhí)行之后

運(yùn)行完上述命令后,會(huì)出現(xiàn)下面的提示:

W12: Warning: File "readonly-file-name" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File:

Vim提示文件更新,詢問(wèn)是確認(rèn)還是重新加載文件。建議直接輸入O,因?yàn)檫@樣可以保留Vim的工作狀態(tài),比如編輯歷史,buffer等,撤消等操作仍然可以繼續(xù)。而如果選擇L,文件會(huì)以全新的文件打開(kāi),所有的工作狀態(tài)便丟失了,此時(shí)無(wú)法執(zhí)行撤消,buffer中的內(nèi)容也被清空。

更簡(jiǎn)單的方案:映射

上述方式非常完美的解決了文章開(kāi)始提出的問(wèn)題,但畢竟命令還是有些長(zhǎng),為了避免每次輸入一長(zhǎng)串的命令,可以將它映射為一個(gè)簡(jiǎn)單的命令加到.vimrc中:

" Allow saving of files as sudo when I forgot to start vim using sudo.

cmap w!! w !sudo tee > /dev/null %

這樣,簡(jiǎn)單的運(yùn)行:w!!即可。命令后半部分> /dev/null在前面已經(jīng)解釋過(guò),作用為顯式的丟掉標(biāo)準(zhǔn)輸出的內(nèi)容。

另一種思路

至此,一個(gè)比較完美但很tricky的方案已經(jīng)完成。你可能會(huì)問(wèn),為什么不用下面這樣更常見(jiàn)的命令呢?這不是更容易理解,更簡(jiǎn)單一些么?

:w !sudo cat > %

重定向的問(wèn)題

我們來(lái)分析一遍,像前面一樣,它可以被轉(zhuǎn)換為相同功能的shell命令:

$ cat readonly-file-name | sudo cat > %

這條命令看起來(lái)一點(diǎn)問(wèn)題沒(méi)有,可一旦運(yùn)行,又會(huì)出現(xiàn)另外一個(gè)錯(cuò)誤:

/bin/sh: readonly-file-name: Permission denied

shell returned 1

這是怎么回事?不是明明加了sudo么,為什么還提示說(shuō)沒(méi)有權(quán)限?稍安勿躁,原因在于重定向,它是由shell執(zhí)行的,在一切命令開(kāi)始之前,shell便會(huì)執(zhí)行重定向操作,所以重定向并未受sudo影響,而當(dāng)前的shell本身也是以普通用戶身份啟動(dòng),也沒(méi)有權(quán)限寫(xiě)此文件,因此便有了上面的錯(cuò)誤。

重定向方案

這里介紹了幾種解決重定向無(wú)權(quán)限錯(cuò)誤的方法,當(dāng)然除了tee方案以外,還有一種比較方便的方案:以sudo打開(kāi)一個(gè)shell,然后在該具有root權(quán)限的shell中執(zhí)行含重定向的命令,如:

:w !sudo sh -c 'cat > %'

可是這樣執(zhí)行時(shí),由于單引號(hào)的存在,所以在Vim中%并不會(huì)展開(kāi),它被原封不動(dòng)的傳給了shell,而在shell中,一個(gè)單獨(dú)的%相當(dāng)于nil,所以文件被重定向到了nil,所有內(nèi)容丟失,保存文件失敗。

既然是由于%沒(méi)有展開(kāi)導(dǎo)致的錯(cuò)誤,那么試著將單引號(hào)'換成雙引號(hào)"再試一次:

:w !sudo sh -c "cat > %"

成功!這是因?yàn)樵趯⒚顐鞯絪hell去之前,%已經(jīng)被擴(kuò)展為當(dāng)前的文件名。有關(guān)單引號(hào)和雙引號(hào)的區(qū)別可以參考這里,簡(jiǎn)單的說(shuō)就是單引號(hào)會(huì)將其內(nèi)部的內(nèi)容原封不動(dòng)的傳給命令,但是雙引號(hào)會(huì)展開(kāi)一些內(nèi)容,比如變量,轉(zhuǎn)義字符等。

當(dāng)然,也可以像前面一樣將它映射為一個(gè)簡(jiǎn)單的命令并添加到.vimrc中:

" Allow saving of files as sudo when I forgot to start vim using sudo.

cmap w!! w !sudo sh -c "cat > %"

注意:這里不再需要把輸出重定向到/dev/null中。

寫(xiě)在結(jié)尾

至此,借助Vim強(qiáng)大的靈活性,實(shí)現(xiàn)了兩種方案,可以在以普通用戶啟動(dòng)的Vim中保存需root權(quán)限的文件。兩者的原理類似,都是利用了Vim可以執(zhí)行外部命令這一特性,區(qū)別在于使用不同的shell命令。如果你還有其它的方案,歡迎給我留言。

(全文完)

feihu

2014.07.30 于 Shenzhen

標(biāo)簽:滄州 榆林 山南 淘寶邀評(píng) 保定 樂(lè)山 河北 河池

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux環(huán)境下VI/VIM編輯文件時(shí)無(wú)權(quán)限保存的解決方法(普通用戶)》,本文關(guān)鍵詞  Linux,環(huán)境,下,VIM,編輯,文件,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux環(huán)境下VI/VIM編輯文件時(shí)無(wú)權(quán)限保存的解決方法(普通用戶)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Linux環(huán)境下VI/VIM編輯文件時(shí)無(wú)權(quán)限保存的解決方法(普通用戶)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美亚洲国产一区在线观看网站| 亚洲一区二区三区中文字幕 | 久久精品一区二区三区不卡 | 久久综合99re88久久爱| 激情综合色综合久久综合| 久久精品噜噜噜成人av农村| 狠狠色丁香婷婷综合久久片| 樱花草国产18久久久久| 欧美精品一区二区三区蜜桃| 欧美日韩一区二区在线观看视频| 日韩精品成人一区二区在线| 亚洲色图视频网站| 亚洲美女在线一区| 亚洲另类春色校园小说| 亚洲色图制服丝袜| 一区二区三区鲁丝不卡| 亚洲欧美色图小说| 亚洲综合激情网| 一区二区免费看| 日韩综合一区二区| 激情图片小说一区| 国产精品一线二线三线| 成人h精品动漫一区二区三区| 国产做a爰片久久毛片| 国产精品乡下勾搭老头1| 国产精品18久久久久| 国产一区二区三区四区在线观看| 久久99精品视频| 韩国精品主播一区二区在线观看 | 亚洲欧洲日韩在线| 国产精品成人网| 精品盗摄一区二区三区| 欧美国产日韩亚洲一区| 一区二区三区在线免费观看| 日韩精品亚洲专区| 国产成人在线视频网址| 欧美伊人久久大香线蕉综合69| 色综合久久久久久久| 日韩欧美一级二级三级久久久| 精品国产伦理网| 亚洲精品自拍动漫在线| 加勒比av一区二区| 欧美午夜在线一二页| 欧美高清视频不卡网| 综合婷婷亚洲小说| 国产成人自拍高清视频在线免费播放| 国产不卡在线一区| 欧美一区二区三区系列电影| 国产女人18毛片水真多成人如厕| 又紧又大又爽精品一区二区| av动漫一区二区| 国产精品久久久久久久裸模| 国产福利一区二区三区视频在线| 色哟哟在线观看一区二区三区| 日韩欧美中文字幕制服| 日韩精品一二三四| 日韩视频免费观看高清在线视频| 国产精品久久久久7777按摩| 国产激情视频一区二区三区欧美 | 日韩欧美在线1卡| 伊人一区二区三区| 日本韩国精品在线| 亚洲一区二区三区视频在线播放| 成人网男人的天堂| 国产精品国模大尺度视频| 99久久免费精品高清特色大片| 国产三级欧美三级| 成人激情小说网站| 亚洲成av人片一区二区三区| 91老师国产黑色丝袜在线| 波多野结衣中文字幕一区 | 日韩一区有码在线| 国产精品一区二区果冻传媒| 日本一区二区三区在线不卡| 成人va在线观看| 亚洲成a人v欧美综合天堂| 91精品国产综合久久精品图片| 免费观看日韩电影| 国产精品视频一二三| 91啪九色porn原创视频在线观看| 国产精品大尺度| 日韩区在线观看| 91九色最新地址| 激情欧美一区二区三区在线观看| 在线综合+亚洲+欧美中文字幕| 日韩国产高清影视| 国产欧美日本一区视频| 9191国产精品| 色乱码一区二区三区88 | 中文字幕在线观看一区| 在线观看不卡视频| 成人午夜在线视频| 亚洲综合图片区| 欧美一级二级在线观看| av福利精品导航| 国产91精品一区二区麻豆亚洲| 五月婷婷激情综合| 国产精品成人网| 日韩一级完整毛片| 激情综合网激情| 秋霞av亚洲一区二区三| 欧美精品一区二区高清在线观看 | 亚洲人成网站影音先锋播放| 欧美大片在线观看一区二区| 欧美少妇性性性| 欧美日韩一区二区在线视频| 国产成a人亚洲| 国产成人啪免费观看软件| 国产精品99久久久久久久vr| 激情综合网av| 成人午夜精品在线| 成人免费毛片app| 91麻豆视频网站| 欧美性猛交xxxxxxxx| 欧美日韩专区在线| 制服丝袜日韩国产| 久久久一区二区三区| 国产精品国产三级国产| 亚洲狠狠爱一区二区三区| 夜夜嗨av一区二区三区四季av| 无码av免费一区二区三区试看| 免费看欧美女人艹b| 国产九色精品成人porny| 成人免费的视频| 911精品产国品一二三产区| 日韩精品一区在线| 亚洲美女淫视频| 国产一区二区三区黄视频| 色婷婷av一区二区| 日韩欧美国产一二三区| 中文在线一区二区| 日本aⅴ精品一区二区三区 | 91网站在线播放| 精品对白一区国产伦| 国产精品国产三级国产| 成人午夜激情视频| 在线亚洲高清视频| 精品福利在线导航| 水蜜桃久久夜色精品一区的特点| 日本vs亚洲vs韩国一区三区二区| 成人永久aaa| 欧美成人精精品一区二区频| 91福利社在线观看| 亚洲国产成人自拍| 国产91丝袜在线18| 欧美一级精品大片| 蜜桃av噜噜一区二区三区小说| 99久久精品免费观看| 国产女主播视频一区二区| 极品少妇xxxx精品少妇| 亚洲在线成人精品| 亚洲一区视频在线观看视频| 中文字幕在线免费不卡| 国产成人丝袜美腿| 国产精品国产a级| av网站免费线看精品| 成人免费一区二区三区在线观看| 国产高清在线精品| 中文字幕av一区二区三区高| 欧美午夜影院一区| 亚洲小少妇裸体bbw| 欧美一级理论性理论a| 九九视频精品免费| 国产三级久久久| 色偷偷久久人人79超碰人人澡 | 亚洲国产精品久久艾草纯爱| 欧美在线影院一区二区| 日韩精品亚洲一区二区三区免费| 日韩片之四级片| 日本韩国视频一区二区| 美女网站色91| 亚洲欧洲日韩av| 日韩一级片网址| 成人av网站在线| 极品少妇一区二区| 中文字幕一区二区三区四区| 99re视频精品| 亚洲第一狼人社区| 国产精品毛片无遮挡高清| 色呦呦日韩精品| 国产一区二区三区精品视频| 亚洲va国产va欧美va观看| 亚洲国产美女搞黄色| 亚洲午夜成aⅴ人片| 91香蕉视频污| 欧美性生活久久| 精品一区二区精品| 无吗不卡中文字幕| 婷婷丁香激情综合| 亚洲欧洲韩国日本视频| 日韩精品自拍偷拍| 日韩三区在线观看| 欧美中文字幕亚洲一区二区va在线| 国产美女久久久久| 久久久久9999亚洲精品| 精品美女一区二区三区| 欧美一二三四在线| 日韩欧美一二三区| 日韩一区二区三区视频在线观看 | 国产丶欧美丶日本不卡视频|