使用触摸屏和vi吗?


55

在编辑之前通过触摸创建文件是否有好处。例如:

touch foo
vi foo

与直接将其提交给编辑器?喜欢:

vi foo

我看到了很多使用前者(touch然后vi)的教程。

Answers:


111

touch首先查看文件会确认您确实具有创建文件的能力,而不是浪费时间在编辑器中只是为了发现文件系统是只读的或其他问题。


6
并且touch允许您chmod +x在编辑之前执行此操作,如果您正在编写#!/bin/bashShell脚本,这将很有意义。
亚伦·麦克戴德

11
另外,您也可以:w在开始后做第一件事vi。(并且:chmod +x %,如果你想使它可执行)
斯特凡Chazelas

26
touch可能在vis :w!会成功的地方失败(例如,如果file存在,但您不是它的所有者,并且对当前目录具有写权限,那么您就没有写权限)。相反,touch可能会成功,但vi:w或者:w!如果你是该文件的所有者可能会失败,但没有写访问它,也不到当前目录(你可以解决它:!chmod +w %(一些vi实现比如vim可以做会自动:w!))。
斯特凡Chazelas

现在很有道理!
Fawix

4
Vim / vi会非常清楚地说明您是否打开了没有写权限的文件:"foo" [readonly]。再次进入插入模式时:Warning: Changing a readonly file.
DevSolar

25

除了给出的答案外,触摸的一个优点是,任何其他用户/终端在触摸同一文件时编辑该文件,当他们尝试保存任何更改时,都会收到警告。

WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?

即使您本身未做任何更改,仅触摸了文件,这也会警告他们。


很好,所以从本质上讲,这是一种发现人们是否正在使用/编辑同一文件并同时发出警告的好方法。我在多租户环境中看到了明显的好处!
Fawix

@Fawix,那么您应该更新此答案Aswell
Kiwy

19

除了可接受的答案:

值得注意的是,touch它用于更新文件时间戳。如果您使用touch存在的文件,它将把文件时间戳更新为当前日期和时间。如果文件不存在,它将创建一个以当前日期和时间为时间戳的空文件。

vi另一方面,除非您写入新文件,否则不会创建新文件。

例如,如果我键入vi test.txt,键入一些注释,然后键入:q!test.txt将不存在。


接受的答案中描述的好处如何?
JBentley '16

8

如果没有touch,则直到您告诉vi编写一个新文件,该文件才存在。

考虑一个多用户系统(也许您在一个由许多系统共享的网络安装文件系统上,每个系统都有许多用户)。运行touch将确保您拥有文件(并且可以对其进行写入),甚至可以更新时间戳。另一个想要创建此类文件的用户将看到您拥有该文件。如果已经存在,并且另一个用户想要删除或替换它,他们会看到它是最近被修改的,也许三思而后行。


4

touch读没有好处。vi如果文件不存在,将创建该文件。

接受的答案是说,它检查您是否可以在浪费时间之前在编辑器中编写内容。没错,但是现在您每次都在浪费时间输入touch。与仅能正常工作的频率相比,无法在某处写入是非常特殊的(只要您记得sudo主目录或之外的文件/tmp,或者以root用户身份登录)。

只需打开编辑器并执行所需操作,然后尝试保存文件。如果使用也不起作用:w!,请将其保存在其他位置(:w ~/asdf)并解决问题。修复后,您可以将文件内容从临时文件复制到原始文件:中cat ~/asdf > /mnt/example.txt && rm ~/asdf。我们使用cat而不是mv或的原因cp是使用目标的权限和其他属性。

此外,对于某些更高级的命令行用法,在解决问题时(或使用或),可以vi在显示Ctrl+的Z同时添加背景,最后再次运行运行write命令。:suspend:susfg

编辑:改进了对/ u / G-Man的评论的回复。谢谢!


3
这里存在一些安全问题:(1)如果该文件/mnt/example.txt不应该被世界范围读取,但是您的umask设置为允许的值(例如22),那么/tmp/asdf 它将被世界范围读取。如果系统上还有其他人,他们也许可以读取文件的临时副本。(2)该文件/mnt/example.txt可能不应该在世界范围内可写,但是,如果系统上有恶意人员,则他们可以读取该文件的临时副本并将其替换为修改后的版本,然后再进行移动/复制它回到正确的位置。  …(续)
G-Man

3
(续)…(将粘滞位设置为开/tmp可能会防止这种情况。)(3)该命令mv /tmp/asdf /mnt/example.txt将完全销毁电流,/mnt/example.txt并用代替/tmp/asdf。要替换的内容/mnt/example.txt内容/tmp/asdf。通过使用mv,设置了/mnt/example.txt具有相同属性/tmp/asdf-可能是由你和世界可读的拥有。可能更好,cp /tmp/asdf /mnt/example.txt甚至更好cat /tmp/asdf > /mnt/example.txt。…PS(4)您可以vi通过键入:suspend(或:sus简称为)暂停。
G-Man

@ G-Man这些是一些优点。我并不特别担心有人在进入的5分钟内偷了一个文件/tmp,但是没有理由不写~/。我也没有想到它将取代属性。我会编辑我的帖子,谢谢:)
吕克(Luc)2013年


1

vi 是可视化文本编辑器(vi = visual)与“ ed”相比还是可视化的,它只允许您一次查看和更改一行文本。

touch命令将更新现有文件上的时间戳,如果该文件尚不存在,则创建一个新文件。这对于测试高度依赖时间戳的内容非常有用。

现在,如果您的文件是文本文件,或者尚不存在,则用vi打开它,然后向vi发出命令:wq,将产生与触摸该文件相同的结果。这是两个命令完全相似的唯一方法。


1

专门用于vi无需在编辑之前创建文件:vi可用于创建和保存新文件。但是,在某些文件需要存在的调用上下文中。例如,在我的系统(OS X)上,我可以启动一个适当的GUI编辑器(由文件类型确定),如下所示:

open foo.txt

这可以foo.txt在TextEdit或emacs中打开,也可以在我指定为文本文件选择的任何编辑器中打开,然后分离该过程,以便我立即得到提示。(open bar.py可以在python编辑器IDLE中打开它;等等。)或者我可以显式请求emacs:

open -a emacs foo.txt

但是open要求文件已经存在,否则会引发错误。因此,我必须将其定义emacs为以下shell函数,这使我即使不存在也可以编写emacs foo启动emacsGUI的代码foo

function emacs () 
{ 
    if [ -n "$1" -a ! -e "$1" ]; then
        /usr/bin/touch "$1";
    fi;
    open -a emacs "$@"
}

0

vi用于以用户身份编辑文件,而touch可以设置文件的时间戳,通常用于脚本等。

创建文件的另一种方法是:

>newfile.txt

1
这是不可靠的,因为未在POSIX规范中指定(afaik)。例如,在中zsh,它等同于cat >newfile.txt并且需要您按Ctrl + D。
亚当·卡兹

@AdamKatz好点;我更新了答案,感谢您的建议。
James Youngman'6

0

通过接触手册页,他的主要工作是更改文件时间戳。
Ofc还将使用当前时间戳创建文件,然后您可以编辑该文件。

VI是文本编辑器,它执行其所说的操作,以编辑文本打开,保存,编辑文件等。

所有都是用户和习惯的味道:然后触摸vi或vi file.txt相同颜色的东西。


0

touch 命令使用当前时间戳更改文件的日期和时间。
如果文件不存在,它将创建带有日期和时间的新文件。

vi 编辑器用于编辑文件(如果文件不存在),除非我们不保存文件,否则它将创建新文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.