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