请教,为什么 vim 的强制保存这么厉害? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
jzq526
V2EX    Linux

请教,为什么 vim 的强制保存这么厉害?

  •  
  •   jzq526 2020-10-13 11:52:06 +08:00 5013 次点击
    这是一个创建于 1849 天前的主题,其中的信息可能已经有所发展或是发生改变。

    无意中发现的一个问题,在 centos7 和 debian 系统上都出现了,应该不是发行版的问题。 先在普通用户主目录下创建一个文件 f1:touch f1 查看其属性:

    ls -l -rw-r--r-- 1 vk vk 26 10 月 13 11:37 f1 

    然后修改文件 f1 的所有者和所属组:

    sudo chown root:root f1 ls -l -rw-r--r-- 1 root root 0 10 月 13 11:36 f1 

    在 vk 用户下编辑:vim f1 写入一些内容之后,直接 :w是无法保存的,提示不能写入只读文件。但可以用:w!保存,保存后所有者和所属组就回到了 用户 vk 和 组 vk 。

    (但在其他目录下就不行了)

    vim 的强制保存这么厉害吗?还是 Linux 对主目录有什么特殊设置?

    15 条回复    2020-10-17 07:47:37 +08:00
    whenov
        1
    whenov  
       2020-10-13 11:57:16 +08:00
    :w[rite]! [++opt] Like ":write", but forcefully write when 'readonly' is
    set or there is another reason why writing was
    refused.
    Note: This may change the permission and ownership of
    the file and break (symbolic) links. Add the 'W' flag
    to 'cpoptions' to avoid this.
    NeezerGu
        2
    NeezerGu  
       2020-10-13 11:58:13 +08:00
    我以前也不知道,不过我在 mac 下试了下。 换了个思路,在 chown 到 root 之后,不带 sudo 直接 chown 回来是不行的,但我可以删除它,相对于其他自己名下的文件,只是多了个是否确定而已。

    那么,vim 自然可以进行,先删除后重新创建并写入的操作(当然可能有更好的解决方案,我只是描述了这并不是只有 vim 可以实现)
    xuboying
        3
    xuboying  
       2020-10-13 12:03:05 +08:00
    vim 应该是删了这个文件重新写了一个。这个文件普通用户是可以删掉的。
    xuboying
        4
    xuboying  
       2020-10-13 12:05:38 +08:00
    @xuboying 想要证明的话应该有很多办法,比如 ls -li 看文件的实体 node 号是否发生了变化
    jzq526
        5
    jzq526  
    OP
       2020-10-13 12:06:57 +08:00
    @NeezerGu 删除权限应该是来自于用户对自己的主目录的操作权限,而不是对这个文件的操作权限。用户对自己的主目录有完全控制权,那么对其下的文件也就可以删除,这是文件权限不能决定的。
    NeezerGu
        6
    NeezerGu      2020-10-13 14:07:30 +08:00
    @jzq526 vim 就利用这个权限删除再重新创建不就好了?
    jzq526
        7
    jzq526  
    OP
       2020-10-13 20:26:07 +08:00
    @xuboying 我用 stat 命令查看了 inode 号,没有发生变化
    VoldikSS
        8
    VoldikSS  
       2020-10-14 20:23:35 +08:00
    确实是删除之后重新创建了: https://github.com/neovim/neovim/blob/master/src/nvim/fileio.c#L3165-L3167

    而且用 `stat` 命令查看时,文件的创建时间也发生了改变
    jzq526
        9
    jzq526  
    OP
       2020-10-15 18:30:08 +08:00
    @VoldikSS 我刚才试了一下,时间确实变了。但我又创建了一个文件,没有改变所有者等属性,保存后,它的时间也变了,而且是三个时间都变了。也就是说,不管是不是强制保存,文件的三个时间属性都会发生改变
    VoldikSS
        10
    VoldikSS  
       2020-10-16 15:04:39 +08:00
    > 但我又创建了一个文件,没有改变所有者等属性,保存后,它的时间也变了,而且是三个时间都变了。

    我试了下结果不是这样,创建时间 没有变
    jzq526
        11
    jzq526  
    OP
       2020-10-16 16:33:40 +08:00
    @VoldikSS 这是修改所有者之后强制保存的,所有的时间都变了
    ```
    vk@vk-debian:~$ rm f1 f2
    vk@vk-debian:~$ touch f1
    vk@vk-debian:~$ stat f1
    文件:f1
    大小:0 块:0 IO 块:4096 普通空文件
    设备:804h/2052d Inode:171 硬链接:1
    权限:(0644/-rw-r--r--) Uid:( 1000/ vk) Gid:( 1000/ vk)
    最近访问:2020-10-16 16:28:49.059459602 +0800
    最近更改:2020-10-16 16:28:49.059459602 +0800
    最近改动:2020-10-16 16:28:49.059459602 +0800
    创建时间:2020-10-16 16:28:49.059459602 +0800
    vk@vk-debian:~$ sudo chown root:root f1
    [sudo] vk 的密码:
    vk@vk-debian:~$ stat f1
    文件:f1
    大小:0 块:0 IO 块:4096 普通空文件
    设备:804h/2052d Inode:171 硬链接:1
    权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
    最近访问:2020-10-16 16:28:49.059459602 +0800
    最近更改:2020-10-16 16:28:49.059459602 +0800
    最近改动:2020-10-16 16:29:08.523425651 +0800
    创建时间:2020-10-16 16:28:49.059459602 +0800
    vk@vk-debian:~$ vim f1
    vk@vk-debian:~$ stat f1
    文件:f1
    大小:11 块:8 IO 块:4096 普通文件
    设备:804h/2052d Inode:171 硬链接:1
    权限:(0644/-rw-r--r--) Uid:( 1000/ vk) Gid:( 1000/ vk)
    最近访问:2020-10-16 16:29:48.343175347 +0800
    最近更改:2020-10-16 16:29:48.343175347 +0800
    最近改动:2020-10-16 16:29:48.343175347 +0800
    创建时间:2020-10-16 16:29:48.343175347 +0800

    ```
    这是没有修改所有者的情况:
    ```
    vk@vk-debian:~$ touch f2
    vk@vk-debian:~$ stat f2
    文件:f2
    大小:0 块:0 IO 块:4096 普通空文件
    设备:804h/2052d Inode:2063 硬链接:1
    权限:(0644/-rw-r--r--) Uid:( 1000/ vk) Gid:( 1000/ vk)
    最近访问:2020-10-16 16:31:13.618070299 +0800
    最近更改:2020-10-16 16:31:13.618070299 +0800
    最近改动:2020-10-16 16:31:13.618070299 +0800
    创建时间:2020-10-16 16:31:13.618070299 +0800
    vk@vk-debian:~$ vim f2
    vk@vk-debian:~$ stat f2
    文件:f2
    大小:9 块:8 IO 块:4096 普通文件
    设备:804h/2052d Inode:2082 硬链接:1
    权限:(0644/-rw-r--r--) Uid:( 1000/ vk) Gid:( 1000/ vk)
    最近访问:2020-10-16 16:31:31.381773198 +0800
    最近更改:2020-10-16 16:31:31.381773198 +0800
    近改动:2020-10-16 16:31:31.385773129 +0800
    创建时间:2020-10-16 16:31:31.381773198 +0800

    ```
    所有的时间都变了。
    此外,用 stat 命令查看时,在 CentOS7 中显示的是三种时间,没有创建时间。但在 debian testing 中显示四种时间,包括创建时间。应该是新版系统后加的吧
    FurN1
        12
    FurN1  
       2020-10-16 17:01:30 +08:00
    我遇到有时候 w!也是不行的,必须要 sudo 打开 vim
    wweir
        13
    wweir  
       2020-10-16 17:47:10 +08:00
    我觉得 Vim 的强制保存还不够,所以单独写了条按键映射

    noremap <M-W> <ESC>:w !sudo tee %<CR>:e!<CR>:x<CR>
    VoldikSS
        14
    VoldikSS  
       2020-10-16 21:40:29 +08:00
    @jzq526 这就不清楚了,好奇怪
    jzq526
        15
    jzq526  
    OP
       2020-10-17 07:47:37 +08:00
    @IgniteWhite 这个情况目前只在一种情况下发现了:在用户编辑在自己的主目录下编辑所有者不是自己的那些文件。其他情况我还没怎么试过
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5042 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 05:42 PVG 13:42 LAX 21:42 JFK 00:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86