创建空文件时,为什么人们更喜欢“触摸文件”而不是“:>>文件”?

Har*_*her 33 shell files touch

直到现在才意识到你可以这样做:

: >> file
Run Code Online (Sandbox Code Playgroud)

它似乎在功能上类似于:

touch file
Run Code Online (Sandbox Code Playgroud)

大多数资源似乎更喜欢 touch 这个内置的 shell 有什么原因吗?

Dop*_*oti 47

你甚至不需要使用:; 你可以> file(至少在bash; 其他壳可能表现不同)。

实际上,这里没有真正的区别(尽管调用 to 的微不足道的开销/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
Run Code Online (Sandbox Code Playgroud)

使用重定向:

$ > 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
Run Code Online (Sandbox Code Playgroud)

  • 似乎 `>> file` 不会更新修改时间。不是 OP 在寻找什么,只是想指出它似乎不是触摸的完整替代品。 (6认同)
  • 由于问题没有指定特定的外壳。最好指出 zsh 中的 `> file` 等价于 `cat > file`,而不是 `:> file`。 (2认同)

ilk*_*chu 32

因为您可以一次处理touch多个文件,而无需输入任何额外的特殊字符。这包括大括号扩展之类的东西,例如touch file{1,2,3,4}.

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

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

  • 如果命令没有被完全理解,总有“人情味”。我怀疑“man :> file”会返回任何有用的东西:-) 还有 WRT 提示,有些(可能是大多数)允许您将提示设置为您喜欢的任何内容。我的显示系统名称(因为我使用了很多远程 xterms)和当前目录,并且针对不同的系统设置为不同的颜色。 (4认同)

yo'*_*yo' 18

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

A FILE argument that does not exist is created empty

随着神秘的东西,如:>,它更难以知道发生了什么事情,并因为没有真正的优势,也没有必要使用。


小智 6

想象一下,您正在搜索一个旧的 shell 脚本,您只记得正在创建 /tmp 中的某个标记文件。很容易为“touch”这个词搜索所有 *.sh 文件。如果您不知道要搜索的确切文件名,则使用冒号查找冒号会产生许多误报。