`date 2&>$0` 有什么作用?

j0h*_*j0h 6 shell bash io-redirection

我正在查看同事的 shell 代码,我看到了这个:

date 2&>$0
Run Code Online (Sandbox Code Playgroud)

我知道日期是什么,但是 2&>$0 在做什么?他出去有一段时间了,所以我不能问他这部分是关于什么的。

Mic*_*mer 10

假设您发布的代码是正确的,它的作用很奇怪。它:

  • Runs date 2,这不是一个有效的调用date并且会产生一个错误消息,然后
  • 重定向其标准输出和标准错误都&>
  • 进入包含运行脚本 ( $0)的文件,擦除其现有内容。

因为 Bash 在脚本中读取的方式是一次从文件中取出一行,这导致它从被覆盖的文件中变得无意义并可能退出(因为该文件已被截断为短于这一行出现的点)或给出一个语法错误(如果原文很短并且错误的一部分作为下一行读入)。

我想不出该行的单一合法用途,但是正如您所说,您已经完全按照书面方式提供了它,这就是它的作用。


严格来说,可以$0通过使用-c选项调用 Bash来赋予另一个值并非破坏性地执行此代码:bash -c "$(<test.bash)" output-file将错误消息放入 中output-file,但这样做是完全不正确的。


Joh*_*024 8

概括

在 下bash,如果该命令在脚本中,则脚本文件将被错误消息覆盖。

例子

考虑脚本:

$ cat test.sh
date 2&>$0
Run Code Online (Sandbox Code Playgroud)

现在,运行脚本:

$ bash test.sh
test.sh: line 2: unexpected EOF while looking for matching ``'
test.sh: line 3: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

观察脚本的新内容:

$ cat test.sh
date: invalid date `2'
Run Code Online (Sandbox Code Playgroud)

解释

命令 ,date 2&>$0解释如下:

  1. date命令与参数一起运行2

  2. date 命令的所有输出,包括 stdout 和 stderr,都被重定向到文件$0. $0是当前脚本的名称。

    该符号>表示默认情况下标准输出的重定向。作为bash扩展,该符号&>是一个快捷方式指示重定向两个输出和错误。因此, stdout 和 stderr 都被重定向到文件$0.

  3. 一旦脚本文件被覆盖,它就不再是有效的脚本,并且bash会抱怨命令格式错误。

bash和 POSIX shell 的区别

对于简单的 POSIX shell,例如dash&>不支持快捷方式。因此,该命令date 2&>$0将重定向标准输出到文件$0。在这种情况下,这意味着脚本文件被空文件覆盖,而date错误消息将出现在终端上。

  • ......但这没有任何意义☹ (2认同)