我在通过nvm安装node时在.profile文件中发现了以下命令:
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
我想知道以下命令中[]
和的目的是什么。&&
我以前没有遇到过这个命令语法,我想了解一下,下面的命令是做什么的,这个语法叫什么?我的猜测是它正在创建一个软链接,对吗?
编辑:nvm.sh 不是可执行文件。
答案1
这[
是一个测试结构:
$ help [
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
这-s
是可用的测试之一,如果文件存在且不为空,则返回 true:
$ help test | grep -- -s
-s FILE True if file exists and is not empty.
是&&
AND操作员。仅当左侧命令成功时才会运行右侧命令。
最后,该.
命令source
告诉 shell 在同一 shell 会话中评估源文件中的任何代码:
$ help .
.: . filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
因此,您发布的命令与以下内容相同:
## If the file exists and is not empty
if [ -s "$NVM_DIR/nvm.sh" ]; then
## Source it
. "$NVM_DIR/nvm.sh"
fi
答案2
cmd1 && cmd2
当且仅当 cmd1 成功时才运行 cmd2。cmd1 && cmd2
如果 和 都成功,那么就成功,cmd1
这就是cmd2
“AND”运算符的想法。
这里,cmd1 是[
命令(用于执行测试),cmd2 是命令.
(用于告诉 shell 评估给定文件中包含的代码)。
该[
命令-s file
用于检查file
文件大小是否非零(如果是则返回成功)。
所以该命令行的意思是:$NVM_DIR/nvm.sh
如果该文件不为空,则解释该文件中的代码。
如果它是空的,那不会有问题,因为该.
命令不会执行任何操作。该测试仍然有用,因为[
命令也会返回错误的如果文件不存在。在类似 Bourne 的 shell 中(bash
除非处于 POSIX 一致性模式),这样做. a-file-that-does-not-exist
会导致 shell 退出(甚至bash
会导致显示错误消息)。
因此,如果不能保证该文件存在(如果不存在也没关系),最好事先检查该文件,这也是[ -s file ]
一种方法。.
如果文件为空,它还有一个优点是可以跳过该命令。
请注意,[ -s file ]
也会返回真的/成功iffile
是非空的并且不是常规文件(如目录),这也会导致命令.
失败。另一种方法可能是存在[ -f file ]
哪些测试file
并且是一个常规文件(或到常规文件的符号链接),尽管这意味着不能再使用非常规文件(如 fifo),并且有人可能会争辩说,如果文件是目录,则输出错误消息会更好,因为这显然是一个病理病例。
另一种方法是[ -r file ]
检查文件是否存在并且可读。但话又说回来,如果不是这样,您可能更喜欢一条错误消息来告诉您问题所在。
还有[ -e file ]
只检查文件是否存在(无论它是否为空、常规、可读或不存在)。