我正在查看同事的 shell 代码,我看到了这个:
date 2&>$0
我知道 date 的作用,但是 2&>$0 在做什么?他出去有一段时间了,所以我不能问他这部分是关于什么的。
答案1
假设您发布的代码是正确的,它的作用很奇怪。它:
因为 Bash 读取脚本的方式是一次从文件中获取一行,这会导致它从覆盖的文件中得到无意义的内容,并可能退出(因为文件已被截断为比该行出现的点短)或给出语法错误(如果原文非常短并且部分错误被读入下一行)。
我想不出该行的任何合法用途,但正如您所说,您已经完全按照书面形式给出了它,这就是它的作用。
严格来说,可以为 赋予另一个值,$0
因此通过使用以下选项调用 Bash 来非破坏性地执行此代码-c
:bash -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
解释如下:
该
date
命令使用参数运行2
date 命令的所有输出(stdout 和 stderr)都被重定向到文件
$0
.$0
是当前脚本的名称。该符号
>
表示默认情况下 stdout 的重定向。作为bash
扩展,符号&>
是一个快捷方式指示重定向两个都标准输出和标准错误。因此,stdout 和 stderr 都被重定向到文件$0
。一旦脚本文件被覆盖,它就不再是有效的脚本,并且
bash
会抱怨格式错误的命令。
bash
和 POSIX shell之间的区别
对于简单的 POSIX shell,例如,不支持dash
快捷方式。&>
因此,命令date 2&>$0
将重定向仅有的标准输出到文件$0
。在这种情况下,这意味着脚本文件被空文件覆盖,同时date
错误消息将出现在终端上。