hi~你不知道的vim小秘密

你不知道的vim小秘密

大家先了解一些背景知識:

1) 給文件增加了i權(quán)限,那文件不能被更改,不能刪除腺办,也不能修改名字以及權(quán)限。

2) 給文件增加a權(quán)限糟描,文件可以追加內(nèi)容怀喉,不能刪除,不能修改內(nèi)容船响,不能修改名字以及權(quán)限躬拢。

3) vim一個文件,如果不正常退出见间,再次編輯時是會提示一些信息的聊闯,并且有一個隱藏的文件.xxx.swp

了解以上知識后,再來看下面的現(xiàn)象:

1) 如果給一個文件增加a權(quán)限米诉,用vim編輯文件馅袁,增加內(nèi)容(注意是在文件末尾增加內(nèi)容,不要修改其他內(nèi)容)荒辕,并不會成功。

2) 如果給一個目錄增加i權(quán)限或者a權(quán)限犹褒,在該目錄下面vim一個文件抵窒,更改文件內(nèi)容可以正常保存。

既然a權(quán)限可以追加內(nèi)容叠骑,那為何vim一個文件在末尾增加內(nèi)容不能成功李皇?

既然i權(quán)限不能修改,那為何在目錄里面變更文件內(nèi)容卻可以成功宙枷?


關(guān)于這兩點掉房,你有沒有疑惑?下面我們來分析原因慰丛。

先不管i或者a權(quán)限卓囚,在一個沒有i或者a權(quán)限的目錄下,編輯一個沒有i或者a權(quán)限的文件诅病,用strace來查看其執(zhí)行過程哪亿。

mkdir /tmp/test

strace vim /tmp/test/aminglinux.txt 2>/tmp/vim.log


寫入一個數(shù)字1,然后保存退出贤笆。再來查看vim.log的內(nèi)容蝇棉。

less /tmp/vim.log?

大部分內(nèi)容你不用關(guān)心,只需要看這幾行:

stat("/tmp/test/aminglinux.txt", 0x7fff072ecb10) = -1 ENOENT (No such file or directory)

access("/tmp/test/aminglinux.txt", W_OK) = -1 ENOENT (No such file or directory)

open("/tmp/test/aminglinux.txt", O_RDONLY) = -1 ENOENT (No such file or directory)

readlink("/tmp/test/aminglinux.txt", 0x7fff072eb360, 4095) = -1 ENOENT (No such file or directory)

open("/tmp/test/.aminglinux.txt.swp", O_RDONLY) = -1 ENOENT (No such file or directory)

open("/tmp/test/.aminglinux.txt.swp", O_RDWR|O_CREAT|O_EXCL, 0600) = 3

open("/tmp/test/.aminglinux.txt.swx", O_RDONLY) = -1 ENOENT (No such file or directory)

open("/tmp/test/.aminglinux.txt.swx", O_RDWR|O_CREAT|O_EXCL, 0600) = 4

unlink("/tmp/test/.aminglinux.txt.swx") = 0

unlink("/tmp/test/.aminglinux.txt.swp") = 0

stat("/tmp/test/.aminglinux.txt.swp", 0x7fff072ec310) = -1 ENOENT (No such file or directory)

lstat("/tmp/test/.aminglinux.txt.swp", 0x7fff072ec3e0) = -1 ENOENT (No such file or directory)

lstat("/tmp/test/.aminglinux.txt.swp", 0x7fff072ec8a0) = -1 ENOENT (No such file or directory)

open("/tmp/test/.aminglinux.txt.swp", O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0600) = 3

stat("/tmp/test/aminglinux.txt", 0x7fff072eac40) = -1 ENOENT (No such file or directory)

stat("/tmp/test/aminglinux.txt", 0x7fff072ebe20) = -1 ENOENT (No such file or directory)

stat("/tmp/test/aminglinux.txt", 0x7fff072eadf0) = -1 ENOENT (No such file or directory)

write(1, ""/tmp/test/aminglinux.txt"", 26) = 26

stat("/tmp/test/aminglinux.txt", 0x7fff072ec050) = -1 ENOENT (No such file or directory)

open("/tmp/test/aminglinux.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4

stat("/tmp/test/aminglinux.txt", {st_mode=S_IFREG|0644, st_size=2, ...}) = 0

stat("/tmp/test/aminglinux.txt", {st_mode=S_IFREG|0644, st_size=2, ...}) = 0

unlink("/tmp/test/.aminglinux.txt.swp") = 0

看起來亂亂的芥永,其實大概的過程就是vim ?/tmp/test/aminglinux.txt時篡殷,先看有沒有.aminglinux.txt.swp以及.aminglinux.txt.swx,因為這兩個文件就是vim產(chǎn)生的臨時文件埋涧,swp先產(chǎn)生板辽,如果swp存在就產(chǎn)生第二個swx奇瘦。寫入的內(nèi)容先存到swp里,當(dāng)保存退出vim時戳气,再把swp的內(nèi)容存到aminglinux.txt里链患,最后刪除掉swp文件。

有了這個認識之后瓶您,我們再來分析上面提到的現(xiàn)象1麻捻。如果文件給了a權(quán)限,那么在編輯該文件時呀袱,會產(chǎn)生swp文件贸毕,當(dāng)保存退出時,swp文件內(nèi)容會寫入該文件夜赵,這相當(dāng)于更改該文件明棍,很線上a權(quán)限是不允許的。

再來分析現(xiàn)象2寇僧,按照我們的推測摊腋,如果目錄給了a權(quán)限,增加文件沒問題嘁傀,也就是說產(chǎn)生swp或者swx文件沒有問題兴蒸,當(dāng)然把swp或者swx內(nèi)容寫入到文件里時也不會有問題,但swp或者swx文件卻不會被刪除了细办,所以再次編輯文件時就會提示臨時文件已經(jīng)存在了橙凳。但這并不會影響修改文件內(nèi)容。

如果給目錄設(shè)置了i權(quán)限的話笑撞,vim編輯文件岛啸,要產(chǎn)生swp或swx肯定會出錯啊,但為何依然能正常編輯文件茴肥? 下面繼續(xù)用strace來分析一下坚踩。

chattr +i ?/tmp/test

strace vim /tmp/test/aminglinux.txt 2> /tmp/vim.log?

看vim.log里面和aminglinux.txt相關(guān)的信息

stat("/tmp/test/aminglinux.txt", {st_mode=S_IFREG|0644, st_size=4, ...}) = 0

stat("/tmp/test/aminglinux.txt", {st_mode=S_IFREG|0644, st_size=4, ...}) = 0

stat("/tmp/test/aminglinux.txt", {st_mode=S_IFREG|0644, st_size=4, ...}) = 0

stat("/tmp/test/aminglinux.txt", {st_mode=S_IFREG|0644, st_size=4, ...}) = 0

access("/tmp/test/aminglinux.txt", W_OK) = 0

open("/tmp/test/aminglinux.txt", O_RDONLY) = 3

readlink("/tmp/test/aminglinux.txt", 0x7fff49efc6f0, 4095) = -1 EINVAL (Invalid argument)

open("/tmp/test/.aminglinux.txt.swp", O_RDONLY) = -1 ENOENT (No such file or directory)

open("/tmp/test/.aminglinux.txt.swp", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied)

stat("/tmp/test/.aminglinux.txt.swp", 0x7fff49efd6a0) = -1 ENOENT (No such file or directory)

lstat("/tmp/test/.aminglinux.txt.swp", 0x7fff49efd770) = -1 ENOENT (No such file or directory)

lstat("/tmp/test/.aminglinux.txt.swp", 0x7fff49efdc30) = -1 ENOENT (No such file or directory)

open("/tmp/test/.aminglinux.txt.swp", O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0600) = -1 EACCES (Permission denied)

readlink("/tmp/test/aminglinux.txt", 0x7fff49efc6f0, 4095) = -1 EINVAL (Invalid argument)

open("/root/tmp/aminglinux.txt.swp", O_RDONLY) = -1 ENOTDIR (Not a directory)

open("/root/tmp/aminglinux.txt.swp", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 ENOTDIR (Not a directory)

stat("/root/tmp/aminglinux.txt.swp", 0x7fff49efd6a0) = -1 ENOTDIR (Not a directory)

lstat("/root/tmp/aminglinux.txt.swp", 0x7fff49efd770) = -1 ENOTDIR (Not a directory)

lstat("/root/tmp/aminglinux.txt.swp", 0x7fff49efdc30) = -1 ENOTDIR (Not a directory)

open("/root/tmp/aminglinux.txt.swp", O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0600) = -1 ENOTDIR (Not a directory)

readlink("/tmp/test/aminglinux.txt", 0x7fff49efc6f0, 4095) = -1 EINVAL (Invalid argument)

open("/var/tmp/aminglinux.txt.swp", O_RDONLY) = -1 ENOENT (No such file or directory)

open("/var/tmp/aminglinux.txt.swp", O_RDWR|O_CREAT|O_EXCL, 0600) = 4

open("/var/tmp/aminglinux.txt.swx", O_RDONLY) = -1 ENOENT (No such file or directory)

open("/var/tmp/aminglinux.txt.swx", O_RDWR|O_CREAT|O_EXCL, 0600) = 5

unlink("/var/tmp/aminglinux.txt.swx")? ?= 0

unlink("/var/tmp/aminglinux.txt.swp")? ?= 0

stat("/var/tmp/aminglinux.txt.swp", 0x7fff49efd6a0) = -1 ENOENT (No such file or directory)

lstat("/var/tmp/aminglinux.txt.swp", 0x7fff49efd770) = -1 ENOENT (No such file or directory)

lstat("/var/tmp/aminglinux.txt.swp", 0x7fff49efdc30) = -1 ENOENT (No such file or directory)

open("/var/tmp/aminglinux.txt.swp", O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0600) = 4

chmod("/var/tmp/aminglinux.txt.swp", 0644) = 0

open("/tmp/test/aminglinux.txt", O_RDONLY) = 3

stat("/tmp/test/aminglinux.txt", {st_mode=S_IFREG|0644, st_size=4, ...}) = 0

stat("/tmp/test/aminglinux.txt", {st_mode=S_IFREG|0644, st_size=4, ...}) = 0

stat("/tmp/test/aminglinux.txt", {st_mode=S_IFREG|0644, st_size=4, ...}) = 0

access("/tmp/test/aminglinux.txt", W_OK) = 0

write(1, ""aminglinux.txt"", 16)? ? ? = 16

stat("aminglinux.txt", {st_mode=S_IFREG|0644, st_size=4, ...}) = 0

access("aminglinux.txt", W_OK)? ? ? ? ? = 0

getxattr("aminglinux.txt", "system.posix_acl_access", 0x7fff49efd050, 132) = -1 ENODATA (No data available)

stat("aminglinux.txt", {st_mode=S_IFREG|0644, st_size=4, ...}) = 0

open("aminglinux.txt", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 3

chmod("aminglinux.txt", 0100644)? ? ? ? = 0

setxattr("aminglinux.txt", "system.posix_acl_access", "x02x00x00x00x01x00x06x00xffxffxffxffx04x00x04x00xffxffxffxff x00x04x00xffxffxffxff", 28, 0) = 0

stat("/tmp/test/aminglinux.txt", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0

unlink("/var/tmp/aminglinux.txt.swp")? ?= 0

我相信你可以看到Permission denied的提示,這是因為當(dāng)前目錄有i權(quán)限瓤狐,不能增加文件堕虹,也就不能在當(dāng)前目錄下生成臨時文件。當(dāng)然芬首,vim如果遇到這樣的問題赴捞,它還是會“曲線救國”的,于是先找/root/tmp/郁稍,但是并沒有該目錄赦政,只好繼續(xù)找/var/tmp/,這個目錄存在,所以就在這個目錄里生成了臨時文件(并不是隱藏的)恢着。后面的操作就不用多說了桐愉。

既然vim可以在/var/tmp/下生成臨時文件,自然也可以在已經(jīng)設(shè)置了i權(quán)限的目錄里編輯文件的掰派,這樣現(xiàn)象2也解釋通了从诲。上面羅嗦了這么多,其實我就想表達如下觀點:

vim編輯文件時靡羡,會在該文件所在目錄生成臨時隱藏文件.swp和.swx系洛,如果那目錄不可寫就會到/root/tmp/下或者/var/tmp/下生成臨時文件(非隱藏),當(dāng)編輯的文件保存后略步,臨時文件刪除描扯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趟薄,隨后出現(xiàn)的幾起案子绽诚,更是在濱河造成了極大的恐慌,老刑警劉巖杭煎,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恩够,死亡現(xiàn)場離奇詭異,居然都是意外死亡羡铲,警方通過查閱死者的電腦和手機蜂桶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犀勒,“玉大人,你說我怎么就攤上這事妥曲〖址眩” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵檐盟,是天一觀的道長褂萧。 經(jīng)常有香客問我,道長葵萎,這世上最難降的妖魔是什么导犹? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮羡忘,結(jié)果婚禮上谎痢,老公的妹妹穿的比我還像新娘。我一直安慰自己卷雕,他們只是感情好节猿,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般滨嘱。 火紅的嫁衣襯著肌膚如雪峰鄙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天太雨,我揣著相機與錄音吟榴,去河邊找鬼。 笑死囊扳,一個胖子當(dāng)著我的面吹牛吩翻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宪拥,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼仿野,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了她君?” 一聲冷哼從身側(cè)響起脚作,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缔刹,沒想到半個月后球涛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡校镐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年亿扁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸟廓。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡从祝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出引谜,到底是詐尸還是另有隱情牍陌,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布员咽,位于F島的核電站毒涧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贝室。R本人自食惡果不足惜契讲,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滑频。 院中可真熱鬧捡偏,春花似錦、人聲如沸峡迷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枣申,卻和暖如春售葡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忠藤。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工挟伙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人模孩。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓尖阔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親榨咐。 傳聞我的和親對象是個殘疾皇子介却,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 多次齿坷,對不同的朋友說,我的人生是失敗的数焊。一路走到今天永淌,看了人間百態(tài),受盡世間冷眼佩耳∷熘可是所有的人都告訴 我,我沒有失...
    萱楚兒閱讀 235評論 0 1
  • 時別兩年干厚,我終于鼓起勇氣將這部電影重溫了一遍李滴,至少我認為再次觀看這部電影是需要勇氣的。 第一次看這部電影蛮瞄,是在大一...
    氫氣球在飄閱讀 785評論 3 1
  • 5,6兩個實驗班成績一塌糊涂所坯,很受打擊,接下來好好分析裕坊,授課模式和學(xué)生掌握入手包竹,消化多少燕酷,盡快解決問題籍凝!簡單的題不...
    薛靈敏閱讀 319評論 1 0
  • 昨天表妹打電話問我,初中有個要好的同學(xué)叫她出去一起吃頓飯苗缩,但她們已經(jīng)半年沒有見面了饵蒂,在糾結(jié)要不要去。 我當(dāng)時就回答...
    邡素閱讀 190評論 0 0
  • 辦學(xué)條件差酱讶,生源差退盯,成為農(nóng)村教育代表。 一、行動改變存在 少抱怨 多行動渊迁,從自己的改變開始 1.開放交流 成就學(xué)校...
    凌沐子閱讀 722評論 0 1