我只是在研究一个脚本,我发现了这一行。谁能告诉我这条线是做什么的。这是代码行。
[ -r "$PosConfigDir/posconfig.sh" ] && . "$PosConfigDir/posconfig.sh"
答案1
它会检查你是否有权r
读取该文件$PosConfigDir/posconfig.sh
,在符号链接解析之后,来源那个文件。
它不保证您可以读取该文件。例如,在大多数系统上,[ -r / ]
会返回 true,但您不能读 /
。
-r
是一个标准测试操作员。
.
是类 Bourne shell 的一个特殊内置命令,它告诉 shell 读取并解释作为参数给出的文件中的代码。source
是 中的等效命令csh
。许多现代的类似 Bourne 的 shellsource
将其理解为.
.
.
对于某些 shell 实现,打开或读取文件失败将导致 shell 中止(在输出错误消息后)。该-r
检查大概是为了防止这种情况发生。
为了防止 shell 中止,在 POSIX shell 中,替代方案可以是
command . "$PosConfigDir/posconfig.sh"
zsh
(尽管上述构造在except insh
或ksh
emulation中不起作用)
为了避免出现错误消息,您需要将 stderr 输出重定向到/dev/null
,但这会产生不必要的副作用,即也会消除 中命令的错误postconfig.sh
。
一个例子:
$ [ -r /etc/os-release ] && . /etc/os-release
$ printf '%s\n' "$PRETTY_NAME"
Debian GNU/Linux 8 (jessie)
PRETTY_NAME
/etc/os-release
在文件中定义:
$ head -n 1 /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"