Answers:
touch
首先查看文件会确认您确实具有创建文件的能力,而不是浪费时间在编辑器中只是为了发现文件系统是只读的或其他问题。
:w
在开始后做第一件事vi
。(并且:chmod +x %
,如果你想使它可执行)
touch
可能在vi
s :w!
会成功的地方失败(例如,如果file
存在,但您不是它的所有者,并且对当前目录具有写权限,那么您就没有写权限)。相反,touch
可能会成功,但vi
的:w
或者:w!
如果你是该文件的所有者可能会失败,但没有写访问它,也不到当前目录(你可以解决它:!chmod +w %
(一些vi
实现比如vim
可以做会自动:w!
))。
"foo" [readonly]
。再次进入插入模式时:Warning: Changing a readonly file.
除了可接受的答案:
值得注意的是,touch
它用于更新文件时间戳。如果您使用touch
存在的文件,它将把文件时间戳更新为当前日期和时间。如果文件不存在,它将创建一个以当前日期和时间为时间戳的空文件。
vi
另一方面,除非您写入新文件,否则不会创建新文件。
例如,如果我键入vi test.txt
,键入一些注释,然后键入:q!
;test.txt
将不存在。
如果没有touch
,则直到您告诉vi
编写一个新文件,该文件才存在。
考虑一个多用户系统(也许您在一个由许多系统共享的网络安装文件系统上,每个系统都有许多用户)。运行touch
将确保您拥有文件(并且可以对其进行写入),甚至可以更新时间戳。另一个想要创建此类文件的用户将看到您拥有该文件。如果已经存在,并且另一个用户想要删除或替换它,他们会看到它是最近被修改的,也许三思而后行。
先touch
读没有好处。vi
如果文件不存在,将创建该文件。
接受的答案是说,它检查您是否可以在浪费时间之前在编辑器中编写内容。没错,但是现在您每次都在浪费时间输入touch
。与仅能正常工作的频率相比,无法在某处写入是非常特殊的(只要您记得sudo
主目录或之外的文件/tmp
,或者以root用户身份登录)。
只需打开编辑器并执行所需操作,然后尝试保存文件。如果使用也不起作用:w!
,请将其保存在其他位置(:w ~/asdf
)并解决问题。修复后,您可以将文件内容从临时文件复制到原始文件:中cat ~/asdf > /mnt/example.txt && rm ~/asdf
。我们使用cat
而不是mv
或的原因cp
是使用目标的权限和其他属性。
此外,对于某些更高级的命令行用法,在解决问题时(或使用或),可以vi
在显示Ctrl+的Z同时添加背景,最后再次运行运行write命令。:suspend
:sus
fg
编辑:改进了对/ u / G-Man的评论的回复。谢谢!
/mnt/example.txt
不应该被世界范围读取,但是您的umask设置为允许的值(例如22),那么/tmp/asdf
它将被世界范围读取。如果系统上还有其他人,他们也许可以读取文件的临时副本。(2)该文件/mnt/example.txt
可能不应该在世界范围内可写,但是,如果系统上有恶意人员,则他们可以读取该文件的临时副本并将其替换为修改后的版本,然后再进行移动/复制它回到正确的位置。 …(续)
/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
简称为)暂停。
/tmp
,但是没有理由不写~/
。我也没有想到它将取代属性。我会编辑我的帖子,谢谢:)
专门用于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
启动emacs
GUI的代码foo
。
function emacs ()
{
if [ -n "$1" -a ! -e "$1" ]; then
/usr/bin/touch "$1";
fi;
open -a emacs "$@"
}
vi用于以用户身份编辑文件,而touch可以设置文件的时间戳,通常用于脚本等。
创建文件的另一种方法是:
>newfile.txt
zsh
,它等同于cat >newfile.txt
并且需要您按Ctrl + D。
touch
允许您chmod +x
在编辑之前执行此操作,如果您正在编写#!/bin/bash
Shell脚本,这将很有意义。