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

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

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

date 2&>$0

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

答案1

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

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

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

我想不出该行的任何合法用途,但正如您所说,您已经完全按照书面形式给出了它,这就是它的作用。


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

答案2

概括

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

例子

考虑脚本:

$ cat test.sh
date 2&>$0

现在,运行脚本:

$ bash test.sh
test.sh: line 2: unexpected EOF while looking for matching ``'
test.sh: line 3: syntax error: unexpected end of file

观察脚本的新内容:

$ cat test.sh
date: invalid date `2'

解释

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

  1. date命令使用参数运行2

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

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

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

bash和 POSIX shell之间的区别

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

相关内容