那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

阿銘linux ? 2018-02-02 15:29 ? 次閱讀

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

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

2) 給文件增加a權限,文件可以追加內容,不能刪除,不能修改內容,不能修改名字以及權限。

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

了解以上知識后,再來看下面的現象:

1) 如果給一個文件增加a權限,用vim編輯文件,增加內容(注意是在文件末尾增加內容,不要修改其他內容),并不會成功。

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

既然a權限可以追加內容,那為何vim一個文件在末尾增加內容不能成功?既然i權限不能修改,那為何在目錄里面變更文件內容卻可以成功?

關于這兩點,你有沒有疑惑?下面我們來分析原因。

先不管i或者a權限,

在一個沒有i或者a權限的目錄下,編輯一個沒有i或者a權限的文件,

用strace來查看其執行過程。

mkdir /tmp/test

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

寫入一個數字1,然后保存退出。再來查看vim.log的內容。

less /tmp/vim.log

大部分內容你不用關心,只需要看這幾行:

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產生的臨時文件,swp先產生,如果swp存在就產生第二個swx。寫入的內容先存到swp里,當保存退出vim時,再把swp的內容存到aminglinux.txt里,最后刪除掉swp文件。

有了這個認識之后,我們再來分析上面提到的現象1。如果文件給了a權限,那么在編輯該文件時,會產生swp文件,當保存退出時,swp文件內容會寫入該文件,這相當于更改該文件,很線上a權限是不允許的。

再來分析現象2,按照我們的推測,如果目錄給了a權限,增加文件沒問題,也就是說產生swp或者swx文件沒有問題,當然把swp或者swx內容寫入到文件里時也不會有問題,但swp或者swx文件卻不會被刪除了,所以再次編輯文件時就會提示臨時文件已經存在了。但這并不會影響修改文件內容。

如果給目錄設置了i權限的話,vim編輯文件,要產生swp或swx肯定會出錯啊,但為何依然能正常編輯文件? 下面繼續用strace來分析一下。

chattr +i /tmp/test

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

看vim.log里面和aminglinux.txt相關的信息

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的提示,這是因為當前目錄有i權限,不能增加文件,也就不能在當前目錄下生成臨時文件。當然,vim如果遇到這樣的問題,它還是會“曲線救國”的,于是先找/root/tmp/,但是并沒有該目錄,只好繼續找/var/tmp/,這個目錄存在,所以就在這個目錄里生成了臨時文件(并不是隱藏的)。后面的操作就不用多說了。

既然vim可以在/var/tmp/下生成臨時文件,自然也可以在已經設置了i權限的目錄里編輯文件的,這樣現象2也解釋通了。上面羅嗦了這么多,其實我就想表達如下觀點:

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210383
  • VIM
    VIM
    +關注

    關注

    0

    文章

    134

    瀏覽量

    15350

原文標題:你所不知道的vim小秘密

文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    12個超實用的vim編輯技巧

    vim 是一個很好用的編輯器,應用十分廣泛。但關于 vim,總有一些你不知道的事情,我們需要持續不斷的學習。
    發表于 11-25 09:26 ?1018次閱讀

    常用編輯器之Vim編輯

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

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

    1、系統終端常用的相關命令1)創建打開文件命令:vim filename我們可以通過以上命令創建一個新文件或者是打開已有文件進行編輯。已打開
    發表于 08-23 09:21

    ADS1211能成功寫入程序,但SDOUT引腳始終讀不到內容,為什么?

    ADS1211能成功寫入程序,但SDOUT引腳始終讀不到內容,SDL引腳已被置1。 能成功寫入程序的表現為: 寫入不同的初始化程序(數據輸出頻率不同),數據準備引腳的輸出頻率就改變,并且值大致符合fDATA的計算公式。 請問S
    發表于 12-12 07:19

    DSP端的程序就不能成功啟動是什么原因

    )",1,但是我將ARM中的工程OMAPL138DemoInterrupt的輸出格式改為"eabi(ELF)"后,在重新合成新的ais文件,燒寫到NandFlash中,此時DSP端的程序就不能成功啟動了,請問是什么原因呢?
    發表于 08-14 10:32

    VIM編輯器使用教程

    8節 VIM編輯器使用教程 主要內容: 1、VIM基本三種模式 2、vim配置文件零基礎學嵌入式
    發表于 12-22 06:22

    VIM編輯器學習

     Vim是一個類似于Vi的文本編輯器,不過在Vi的基礎上增加了很多新的特性,Vim普遍被推崇為類Vi編輯器中最好的一個,事實上真正的勁敵來自
    發表于 08-11 16:58 ?1004次閱讀

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

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

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

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

    linux怎樣進入vim編輯模式

    在Linux中,要進入Vim編輯器的編輯模式,可以按照以下步驟進行操作: 打開終端或命令行界面。 輸入以下命令來啟動Vim編輯器:
    的頭像 發表于 11-26 15:43 ?5030次閱讀

    linux怎么執行vim編輯的程序

    在Linux中,你可以通過以下步驟執行Vim編輯器中編寫的程序: 打開終端或命令行界面。 使用Vim編輯器打開你的程序文件。假設你的程序
    的頭像 發表于 11-26 15:45 ?1233次閱讀

    linux使用vim新建并編輯文件

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

    linux怎么執行vim編輯的程序

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

    vim編輯器如何使用

    Vim編輯器是一個功能強大的文本編輯器,它基于Vi進行改進,并增加了許多新特性。Vim編輯器的使
    的頭像 發表于 08-30 14:58 ?525次閱讀

    vim編輯器命令模式使用方法

    Vim編輯器是一款功能強大的文本編輯器,廣泛應用于程序員和開發者的日常工作中。Vim編輯器擁有多種模式,其中命令模式(Command mod
    的頭像 發表于 08-30 15:01 ?497次閱讀
    昭平县| 百家乐官网庄闲的几率| 佛山市| 百家乐官网玄机| 黄金岛棋牌游戏下载| 富二代百家乐的玩法技巧和规则| 利澳百家乐的玩法技巧和规则| 大发888游戏代充值100| 九乐棋牌下载| 百家乐官网导航网| 百家乐官网博赌城| 百家乐免费试玩游戏| 伯爵百家乐赌场娱乐网规则| 二八杠分析仪| 易胜博娱乐城| 永康市| 百家乐官网水晶筹码价格| 君怡百家乐官网的玩法技巧和规则 | 百家乐官网网真人真钱群| 哪里有百家乐官网投注网| 澳门百家乐官网网上赌城| 新西兰百家乐的玩法技巧和规则| 舟山星空棋牌首页| 百家乐官网获胜秘决百家乐官网获胜秘诀| 百家乐怎么赢博彩正网| 威尼斯人娱乐下载平台| 新宝娱乐| 线上百家乐官网平台| 环球百家乐现金网| 李雷雷百家乐的奥妙| 百家乐官网视频台球游戏| 扑克王百家乐官网的玩法技巧和规则 | 娱网棋牌大厅| 大发888老l| 百家乐官网网站新全讯网| 百家乐手机游戏下载| 大发888国际娱乐城| 百家乐官网现金网信誉排名| 真人百家乐好不好玩| 在线龙虎斗| 励骏会百家乐官网的玩法技巧和规则 |