当创建一个空文件时,为什么人们会更喜欢'touch file'而不是':>> file'?


33

直到现在才意识到您可以执行此操作:

: >> file

它在功能上似乎类似于:

touch file

为什么大多数资源似乎都喜欢触摸而不是内置此shell?


7
简短形式可能与外壳相关,而touch是独立命令。因此,简短形式取决于您使用的外壳(并且人们在此方面确实有很强的偏好),因为可能不是所有人都提供了快捷方式。touch无论您使用哪种方式,都可以独立运行。
Patrick Mevzek '18


6
第一个示例应编辑为: >> file>> file,以使它们具有相同的效果,即不破坏文件的内容。
user000001

2
touch主要更新mtime。不同于,它不会清空现有文件>
rexkogitans

2
这两个命令都不创建空文件。仅当文件尚不存在时,它们才具有此结果。要保证文件为空,您需要> file
亚历克西斯

Answers:


47

你甚至不需要使用:; 您可以这样做> file(至少在bash;其他shell可能会有所不同)。

实际上,这里并没有真正的区别(尽管呼出的细微开销/bin/touch是一回事)。

touch但是,还可以用于修改已经存在的文件上的时间戳,而无需更改或擦除其内容;进一步,> file将炸毁任何file已经存在的东西。可以改用来解决此问题>> file

另一个不同之处touch是,您可以让它一次创建(或更新时间戳)多个文件(例如touch foo bar baz quux),而语法比重定向更简洁,因为每个文件都需要自己的重定向(例如>foo >bar >baz >quux)。

使用touch

$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:19 2018
Modify: Fri May 25 10:55:19 2018
Change: Fri May 25 10:55:19 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:55:21 2018
Change: Fri May 25 10:55:21 2018

使用重定向:

$ > foo; stat -x foo; sleep 2; >> foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018

6
似乎>> file不会更新修改时间。OP并不是在寻找什么,而只是想指出它似乎并不是触摸的完整选择。
Jesse_b

2
由于该问题未指定特定的外壳。最好指出> filezsh中的等效于cat > file,而不是: > file
JoL

此外,tcsh允许: > file,但会出错> file。也许> fileto 的等效项: > file仅限于本壳和bash?
JoL

+1彻底,但是请注意,在几个主流壳(我甚至会想全部或大部分炮弹因为最简单的实现自然会导致这种情况的工作作为一个副作用),你可以使用shell重定向触摸多个文件:: >foo >bar: >>foo >>bar将同时触摸foobar
mtraceur

只是因为此处实际问题的上下文而显得脚,但: >foo >bar不会touch归档。它将把(空)输出重定向: 文件中。 touch会触摸文件。(:
DopeGhoti '18

32

因为您可以touch一次输入多个文件而无需键入任何额外的特殊字符。其中包括诸如括号扩展之类的内容touch file{1,2,3,4}

另一个问题是,当您编写教程时,意识到您的读者可能不太熟悉该主题非常重要。一个简单的命令比看起来有些奇怪的非字母字符组合更容易理解。我希望有很多不知道是什么的临时shell用户,:原因很简单,因为它实际上并没有任何事情。同样,对于> foo没有命令的平原:即使您知道重定向是什么,没有源的重定向也可能是不直观的。

另外,在unix.se上,我们经常编写带有前导美元符号的命令示例来指示提示。该行开头的特殊字符可能与此混淆。(请注意,有些系统和外壳程序>用作默认提示的一部分。)


4
而且,如果对命令的理解不完全,那么总会有“ man touch”。我怀疑“ man:> file”是否会返回任何有用的内容:-)还有WRT提示,有些(也许是大多数)允许您将提示设置为您喜欢的任何内容。我的会显示系统名称(因为我使用了很多远程xterm)和当前目录,并且为不同的系统设置了不同的颜色。
jamesqf

1
@jamesqf,是的。现在,当然,help :您的外壳也可以提供文件资料。但这需要将:其本身识别为命令,记住并非所有内容都有手册页,最后要能够:在文档中找到。最后一部分可能很困难。:D
ilkkachu

@jamesqf,是的,我主要是指默认提示的最后一个字符。
ilkkachu

1
+1用于指出直觉和不是模糊的构造方面。
mtraceur

@ilkkachu:是的。在文档中查找冒号并不那么困难:查找不仅仅是标点符号的冒号是另一回事:-)
jamesqf

18

好吧,对我而言,主要原因是可读性。随着touch file你知道发生了什么事情,甚至有人不太在shell脚本知道这是怎么回事教育。如果没有,那么很容易做到man touch并看到以下内容:

A FILE argument that does not exist is created empty

使用诸如:和这类神秘的东西>,就很难知道发生了什么,并且由于没有真正的优势,因此无需使用它。


6

想象一下,您正在寻找一个旧的Shell脚本,而您只记得其中的一个脚本文件/ tmp正在创建。将所有* .sh文件复制为单词“ touch”很容易。如果您不知道要搜索哪个确切的文件名,则加一个冒号会产生许多误报。

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.