Linux 为什么';t'';var=值echo$var'';发射值?

Linux 为什么';t'';var=值echo$var'';发射值?,linux,bash,shell,Linux,Bash,Shell,想验证我对这些情况为何表现不同的理解: 我认为发生#1是因为赋值和echo在shell中作为单个命令运行,并且在echo执行时未设置$SOME_VAR(shell在执行之前展开所有变量) 我认为发生#2是因为赋值和echo在同一个shell中作为两个单独的命令运行,并且在执行echo时在shell中设置了$SOME_VAR #2 $ unset SOME_VAR $ SOME_VAR=abcdef ; echo $SOME_VAR abcdef 我不明白为什么会发生#3 #3 $ unse

想验证我对这些情况为何表现不同的理解:

我认为发生#1是因为赋值和echo在shell中作为单个命令运行,并且在echo执行时未设置$SOME_VAR(shell在执行之前展开所有变量)

我认为发生#2是因为赋值和echo在同一个shell中作为两个单独的命令运行,并且在执行echo时在shell中设置了$SOME_VAR

#2
$ unset SOME_VAR
$ SOME_VAR=abcdef   ; echo $SOME_VAR
abcdef
我不明白为什么会发生#3

#3
$ unset SOME_VAR
$ SOME_VAR=abcdef   ./test.sh # prints abcdef 
abcdef
我认为发生#4是因为shell脚本的赋值和执行在父shell中作为两个不同的命令执行,而在test.sh中执行命令的子shell不会继承一些#VAR(因为没有export语句)

test.sh包含:

$ cat test.sh
#!/bin/bash

echo $SOME_VAR

示例1之所以发生,是因为变量展开首先发生。在这种情况下,事件的顺序是:

  • 展开
    $SOME\u VAR
    (到空字符串)
  • SOME_VAR
    设置为
    abcdef
  • 调用
    echo
    (没有参数,因为
    $SOME\u VAR
    扩展为空字符串)
  • 正如您所说,发生示例2是因为命令是单独运行的

    示例3之所以发生,是因为在调用
    /test.sh
    之前,
    某些变量设置为
    abcdef
    ,并且是运行
    /test.sh
    的环境的一部分。这实际上就是成语
    VAR=value命令的目的。您希望
    command
    能够使用
    VAR
    ,但不一定希望其他所有命令或子shell都能看到它

    示例4之所以发生,是因为
    SOME_VAR
    是当前shell中的一个局部变量,并且尚未
    export
    -ed以便子shell可以使用它

    示例5将是:

    unset SOME_VAR
    export SOME_VAR=abcdef ; ./test.sh # prints abcdef
    

    要了解发生了什么,您可以查看脚本运行环境中有哪些可用变量;如果您将
    env | grep'SOME_VAR'
    添加到
    test.sh
    ,您将看到有什么不同。大多数情况下,#3将
    SOME_VAR
    添加到子流程的环境中,但#4没有。如果将#4更改为
    导出一些_VAR=abcdef/test.sh
    ,它将打印值。
    $ cat test.sh
    #!/bin/bash
    
    echo $SOME_VAR
    
    unset SOME_VAR
    export SOME_VAR=abcdef ; ./test.sh # prints abcdef