sou*_*der 4 bash profile bashrc
我在通过 nvm 安装节点时在 .profile 文件中发现了以下命令:
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
Run Code Online (Sandbox Code Playgroud)
我想知道是什么的目的[],并&&在下面的命令。
之前没遇到过这个命令语法,想了解一下,下面这个命令是做什么的,语法叫什么?我的猜测是它正在创建一个软链接,对吗?
编辑: nvm.sh 不是可执行文件。
ter*_*don 11
这[是一个测试结构:
$ 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 `['.
Run Code Online (Sandbox Code Playgroud)
这-s是可用的测试之一,如果文件既存在又不为空,则返回 true:
$ help test | grep -- -s
-s FILE True if file exists and is not empty.
Run Code Online (Sandbox Code Playgroud)
该&&是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.
Run Code Online (Sandbox Code Playgroud)
因此,您发布的命令与以下命令相同:
## If the file exists and is not empty
if [ -s "$NVM_DIR/nvm.sh" ]; then
## Source it
. "$NVM_DIR/nvm.sh"
fi
Run Code Online (Sandbox Code Playgroud)
cmd1 && cmd2
Run Code Online (Sandbox Code Playgroud)
当且仅当 cmd1 成功时才运行 cmd2。cmd1 && cmd2如果两者都成功,那么就是成功的cmd1,cmd2这就是“AND”运算符的想法。
这里,cmd1 是[命令(用于执行测试),cmd2 是.命令(用于告诉 shell 评估给定文件中包含的代码)。
对于[命令-s file是检查file文件是否具有非零大小(如果是这种情况,则返回成功)。
所以该命令行意味着:如果该文件不为空,则解释$NVM_DIR/nvm.sh文件中的代码。
如果它是空的,那不会有问题,因为.命令什么也不做。该测试仍然有用,因为如果文件不存在,该[命令也会返回false。在类似 Bourne 的 shell 中(bash尽管如此,除非在 POSIX 一致性模式下),否则. a-file-that-does-not-exist会导致 shell 退出(即使在bash这种情况下也会导致显示错误消息)。
因此,如果不能保证该文件存在(如果不存在也没关系),最好事先检查该文件,这[ -s file ]是一种方法。.如果文件为空,它还有一个好处是跳过命令。
请注意,如果非空且不是常规文件(如目录),[ -s file ]也会返回true / successfile,这也会导致.命令失败。另一种方法可能是[ -f file ]哪些测试file存在并且是常规文件(或常规文件的符号链接),但这意味着不能再使用非常规文件(如 fifos),并且有人可能会争辩说输出错误消息,如果该文件是一个目录会更可取,因为这显然是一个病态的情况。
另一种方法可能是[ -r file ]检查文件是否存在并且是否可读。但话又说回来,如果不是,您可能更喜欢错误消息来告诉您问题。
还有[ -e file ]只检查文件是否存在(无论它是空的、常规的、可读的还是不存在的)。