一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用vim編輯文件,增加內(nèi)容不能成功的原因分析

阿銘linux ? 2018-02-02 15:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大家先了解一些背景知識(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í)文件刪除。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213815
  • VIM
    VIM
    +關(guān)注

    關(guān)注

    0

    文章

    136

    瀏覽量

    15770

原文標(biāo)題:你所不知道的vim小秘密

文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    12個(gè)超實(shí)用的vim編輯技巧

    vim 是一個(gè)很好用的編輯器,應(yīng)用十分廣泛。但關(guān)于 vim,總有一些你不知道的事情,我們需要持續(xù)不斷的學(xué)習(xí)。
    發(fā)表于 11-25 09:26 ?1136次閱讀

    常用編輯器之Vim編輯

    器一般有三種模式:一般模式、命令模式、編輯模式。輸入vim或者是vim文件名 ,即可啟動(dòng)Vim編輯
    發(fā)表于 08-22 09:48

    Vim編輯器之Vim常用操作命令

    1、系統(tǒng)終端常用的相關(guān)命令1)創(chuàng)建打開(kāi)文件命令:vim filename我們可以通過(guò)以上命令創(chuàng)建一個(gè)新文件或者是打開(kāi)已有文件進(jìn)行編輯。已打開(kāi)
    發(fā)表于 08-23 09:21

    DSP端的程序就不能成功啟動(dòng)是什么原因?

    )",1,但是我將ARM中的工程O(píng)MAPL138DemoInterrupt的輸出格式改為"eabi(ELF)"后,在重新合成新的ais文件,燒寫(xiě)到NandFlash中,此時(shí)DSP端的程序就不能成功啟動(dòng)了,請(qǐng)問(wèn)是什么原因呢?
    發(fā)表于 08-14 10:32

    VIM編輯器使用教程

    8節(jié) VIM編輯器使用教程 主要內(nèi)容: 1、VIM基本三種模式 2、vim配置文件零基礎(chǔ)學(xué)嵌入式
    發(fā)表于 12-22 06:22

    VIM編輯器學(xué)習(xí)

     Vim是一個(gè)類似于Vi的文本編輯器,不過(guò)在Vi的基礎(chǔ)上增加了很多新的特性,Vim普遍被推崇為類Vi編輯器中最好的一個(gè),事實(shí)上真正的勁敵來(lái)自
    發(fā)表于 08-11 16:58 ?1113次閱讀

    如何在Vim/Vi編輯器中復(fù)制、剪切和粘貼

    使用vim編輯文本文件時(shí),復(fù)制,剪切和粘貼文本是最常執(zhí)行的任務(wù)之一。Vim或早期版本Vi已預(yù)裝在macOS和所有Linux發(fā)行版。
    的頭像 發(fā)表于 12-09 16:54 ?1.2w次閱讀

    vim編輯器的三種模式分別是什么

    Vim編輯器具有三種模式,分別是: 命令模式(Command Mode):這是Vim的默認(rèn)模式,也是啟動(dòng)后的初始模式。在該模式下,用戶不能直接編輯
    的頭像 發(fā)表于 11-26 15:37 ?8606次閱讀

    linux怎樣進(jìn)入vim編輯模式

    在Linux中,要進(jìn)入Vim編輯器的編輯模式,可以按照以下步驟進(jìn)行操作: 打開(kāi)終端或命令行界面。 輸入以下命令來(lái)啟動(dòng)Vim編輯器:
    的頭像 發(fā)表于 11-26 15:43 ?5765次閱讀

    linux怎么執(zhí)行vim編輯的程序

    在Linux中,你可以通過(guò)以下步驟執(zhí)行Vim編輯器中編寫(xiě)的程序: 打開(kāi)終端或命令行界面。 使用Vim編輯器打開(kāi)你的程序文件。假設(shè)你的程序
    的頭像 發(fā)表于 11-26 15:45 ?1501次閱讀

    linux使用vim新建并編輯文件

    在Linux系統(tǒng)下,Vim是一款功能強(qiáng)大的文本編輯器。它可以用于新建并編輯文件,具有很多高級(jí)功能和快捷鍵。下面是關(guān)于如何在Linux上使用Vim
    的頭像 發(fā)表于 11-28 15:17 ?4074次閱讀

    linux怎么執(zhí)行vim編輯的程序

    vim 命令,后面加上要編輯文件名。例如, vim test.txt 將打開(kāi)一個(gè)名為test.txt的文件。如果
    的頭像 發(fā)表于 11-28 15:23 ?1241次閱讀

    vim編輯器如何使用

    Vim編輯器是一個(gè)功能強(qiáng)大的文本編輯器,它基于Vi進(jìn)行改進(jìn),并增加了許多新特性。Vim編輯器的使
    的頭像 發(fā)表于 08-30 14:58 ?894次閱讀

    Linux下Vim編輯器的使用技巧

    為什么要學(xué)習(xí)vim?? 都21世紀(jì)了,為什么還需要學(xué)習(xí)vim? ? 只要你服務(wù)器,vim就是個(gè)必備技能 ? 后端和運(yùn)維工程師必須掌握的編輯
    的頭像 發(fā)表于 04-01 17:36 ?560次閱讀
    Linux下<b class='flag-5'>Vim</b><b class='flag-5'>編輯</b>器的使用技巧

    Vim編輯器的基本操作

    26個(gè)字母鍵為核心,極簡(jiǎn)的操作重構(gòu)了代碼編輯的宇宙。今天,就讓我們一同走進(jìn)Vim的世界,探索它如何以獨(dú)特的方式提升你的編程效率。
    的頭像 發(fā)表于 05-06 13:41 ?440次閱讀
    <b class='flag-5'>Vim</b><b class='flag-5'>編輯</b>器的基本操作