命令是什么 [ -s "$NVM_DIR/nvm.sh" ] && 。 “$NVM_DIR/nvm.sh”在做什么

命令是什么 [ -s "$NVM_DIR/nvm.sh" ] && 。 “$NVM_DIR/nvm.sh”在做什么

我在通过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 ]只检查文件是否存在(无论它是否为空、常规、可读或不存在)。

相关内容