大家先了解一些背景知識(shí):
1) 給文件增加了i權(quán)限,那文件不能被更改,不能刪除,也不能修改名字以及權(quán)限。
2) 給文件增加a權(quán)限,文件可以追加內(nèi)容,不能刪除,不能修改內(nèi)容,不能修改名字以及權(quán)限。
3) vim一個(gè)文件,如果不正常退出,再次編輯時(shí)是會(huì)提示一些信息的,并且有一個(gè)隱藏的文件.xxx.swp
了解以上知識(shí)后,再來(lái)看下面的現(xiàn)象:
1) 如果給一個(gè)文件增加a權(quán)限,用vim編輯文件,增加內(nèi)容(注意是在文件末尾增加內(nèi)容,不要修改其他內(nèi)容),并不會(huì)成功。
2) 如果給一個(gè)目錄增加i權(quán)限或者a權(quán)限,在該目錄下面vim一個(gè)文件,更改文件內(nèi)容可以正常保存。
既然a權(quán)限可以追加內(nèi)容,那為何vim一個(gè)文件在末尾增加內(nèi)容不能成功?既然i權(quán)限不能修改,那為何在目錄里面變更文件內(nèi)容卻可以成功?
關(guān)于這兩點(diǎn),你有沒(méi)有疑惑?下面我們來(lái)分析原因。
先不管i或者a權(quán)限,
在一個(gè)沒(méi)有i或者a權(quán)限的目錄下,編輯一個(gè)沒(méi)有i或者a權(quán)限的文件,
用strace來(lái)查看其執(zhí)行過(guò)程。
mkdir /tmp/test
strace vim /tmp/test/aminglinux.txt 2>/tmp/vim.log
寫(xiě)入一個(gè)數(shù)字1,然后保存退出。再來(lái)查看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
看起來(lái)亂亂的,其實(shí)大概的過(guò)程就是vim /tmp/test/aminglinux.txt時(shí),先看有沒(méi)有.aminglinux.txt.swp以及.aminglinux.txt.swx,因?yàn)檫@兩個(gè)文件就是vim產(chǎn)生的臨時(shí)文件,swp先產(chǎn)生,如果swp存在就產(chǎn)生第二個(gè)swx。寫(xiě)入的內(nèi)容先存到swp里,當(dāng)保存退出vim時(shí),再把swp的內(nèi)容存到aminglinux.txt里,最后刪除掉swp文件。
有了這個(gè)認(rèn)識(shí)之后,我們?cè)賮?lái)分析上面提到的現(xiàn)象1。如果文件給了a權(quán)限,那么在編輯該文件時(shí),會(huì)產(chǎn)生swp文件,當(dāng)保存退出時(shí),swp文件內(nèi)容會(huì)寫(xiě)入該文件,這相當(dāng)于更改該文件,很線上a權(quán)限是不允許的。
再來(lái)分析現(xiàn)象2,按照我們的推測(cè),如果目錄給了a權(quán)限,增加文件沒(méi)問(wèn)題,也就是說(shuō)產(chǎn)生swp或者swx文件沒(méi)有問(wèn)題,當(dāng)然把swp或者swx內(nèi)容寫(xiě)入到文件里時(shí)也不會(huì)有問(wèn)題,但swp或者swx文件卻不會(huì)被刪除了,所以再次編輯文件時(shí)就會(huì)提示臨時(shí)文件已經(jīng)存在了。但這并不會(huì)影響修改文件內(nèi)容。
如果給目錄設(shè)置了i權(quán)限的話,vim編輯文件,要產(chǎn)生swp或swx肯定會(huì)出錯(cuò)啊,但為何依然能正常編輯文件? 下面繼續(xù)用strace來(lái)分析一下。
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的提示,這是因?yàn)楫?dāng)前目錄有i權(quán)限,不能增加文件,也就不能在當(dāng)前目錄下生成臨時(shí)文件。當(dāng)然,vim如果遇到這樣的問(wèn)題,它還是會(huì)“曲線救國(guó)”的,于是先找/root/tmp/,但是并沒(méi)有該目錄,只好繼續(xù)找/var/tmp/,這個(gè)目錄存在,所以就在這個(gè)目錄里生成了臨時(shí)文件(并不是隱藏的)。后面的操作就不用多說(shuō)了。
既然vim可以在/var/tmp/下生成臨時(shí)文件,自然也可以在已經(jīng)設(shè)置了i權(quán)限的目錄里編輯文件的,這樣現(xiàn)象2也解釋通了。上面羅嗦了這么多,其實(shí)我就想表達(dá)如下觀點(diǎn):
vim編輯文件時(shí),會(huì)在該文件所在目錄生成臨時(shí)隱藏文件.swp和.swx,如果那目錄不可寫(xiě)就會(huì)到/root/tmp/下或者/var/tmp/下生成臨時(shí)文件(非隱藏),當(dāng)編輯的文件保存后,臨時(shí)文件刪除。
-
Linux
+關(guān)注
關(guān)注
87文章
11511瀏覽量
213815 -
VIM
+關(guān)注
關(guān)注
0文章
136瀏覽量
15770
原文標(biāo)題:你所不知道的vim小秘密
文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
12個(gè)超實(shí)用的vim編輯技巧
Vim編輯器之Vim常用操作命令
DSP端的程序就不能成功啟動(dòng)是什么原因?
VIM編輯器學(xué)習(xí)
如何在Vim/Vi編輯器中復(fù)制、剪切和粘貼
vim編輯器的三種模式分別是什么
linux怎樣進(jìn)入vim編輯模式
linux怎么執(zhí)行vim編輯的程序
linux使用vim新建并編輯文件
linux怎么執(zhí)行vim編輯的程序
vim編輯器如何使用
Linux下Vim編輯器的使用技巧

Vim編輯器的基本操作

評(píng)論