Linux 为什么使用./shell.sh会出现错误,但是。shell.sh works

Linux 为什么使用./shell.sh会出现错误,但是。shell.sh works,linux,bash,shell,Linux,Bash,Shell,shell脚本: VAR=(aa bb cc) for i in "${VAR[@]}" do echo $i; done 当运行它时使用。ar_test.sh,它起作用了 zhangyf@zhangyf-desktop:~/test$ . ar_test.sh aa bb cc 但这样失败了, zhangyf@zhangyf-desktop:~/test$ ./ar_test.sh ./ar_test.sh: 9: Syntax error: "(" unexpect

shell脚本:

VAR=(aa bb cc)

for i in "${VAR[@]}"
do
        echo $i;
done
当运行它时使用。ar_test.sh,它起作用了

zhangyf@zhangyf-desktop:~/test$ . ar_test.sh 
aa
bb
cc
但这样失败了,

zhangyf@zhangyf-desktop:~/test$ ./ar_test.sh 
./ar_test.sh: 9: Syntax error: "(" unexpected

文件中还有其他行,所以第9行实际上是VAR=aa-bb-cc。我知道区别在于后者派生一个新的shell进程,而前者在当前shell中运行脚本,但是为什么结果会有如此大的差异呢

不同的不是叉子,而是不同的贝壳。当前shell中的源文件和./ar_test.sh使用默认的shell/bin/sh运行可执行文件,这可能不支持数组。使用shebang作为脚本的第一行,以指定适当的shell:

#!/bin/bash
...other code goes here...

不同的不是叉子,而是不同的贝壳。当前shell中的源文件和./ar_test.sh使用默认的shell/bin/sh运行可执行文件,这可能不支持数组。使用shebang作为脚本的第一行,以指定适当的shell:

#!/bin/bash
...other code goes here...

您当前的shell可能是bash。如果您的shebang行启动/bin/sh,那么VAR=aa-bb-cc将不起作用。使用源代码。命令,脚本将在当前shell(即bash`)中运行

确保脚本的第一行是:

#!/bin/bash
在新shell中启动脚本的另一种方法是bash ar_test.sh


作为对评论中激烈讨论的回应:如果您想让您的脚本在bash可能未安装在其标准位置的系统上保持可移植性,您应该将/usr/bin/env bash作为第一行。

您当前的shell可能是bash。如果您的shebang行启动/bin/sh,那么VAR=aa-bb-cc将不起作用。使用源代码。命令,脚本将在当前shell(即bash`)中运行

确保脚本的第一行是:

#!/bin/bash
在新shell中启动脚本的另一种方法是bash ar_test.sh


作为对评论中激烈讨论的回应:如果您想让您的脚本在bash可能未安装在其标准位置的系统上保持可移植性,您应该将/usr/bin/env bash作为第一行。

有聪明的懒惰者,也有愚蠢的懒惰者。写作/usr/bin/env bash可能还需要一秒钟的时间,但它使脚本具有可移植性。最好教人正确的方法/usr/bin/env env bash;我知道你的意思,我想我记得莱纳斯对便携性的一些咆哮。引用wikipedia on:»这种方法可能会引入漏洞,暴露信息或获得未经授权的根访问权限,并且不会授予完全的可移植性。«@Andersjöqvist,所以您认为/usr/bin/env比/bin/bash更容易访问/当/bin始终位于根目录中时,甚至可能不会安装usrpartition@knittl我以前听过,到目前为止还没有人能向我解释为什么这是一个问题。我遵循了你引用的句子中的参考链接,但我不认为该链接讨论了这一问题。该页面所说的是,您不应该让用户定义自己的环境变量。但是,如果用户已经安装了恶意脚本并更改了环境变量,该怎么办?为什么他需要利用另一个程序来运行他的脚本?他还不如自己动手。无论如何,一切都是在他的权限下运行的。@Ineu是的,我认为/usr/bin/env比/bin/bash更有可能出现在那里,尽管我知道情况并非总是如此。在我的系统中,bash位于/usr/local/bin/bash中。我是否应该从/bin/bash创建一个符号链接?请注意,即使是您应该使用的状态/usr/bin/env python,甚至不承认还有其他方法。有聪明的懒惰,也有愚蠢的懒惰。写作/usr/bin/env bash可能还需要一秒钟的时间,但它使脚本具有可移植性。最好教人正确的方法/usr/bin/env env bash;我知道你的意思,我想我记得莱纳斯对便携性的一些咆哮。引用wikipedia on:»这种方法可能会引入漏洞,暴露信息或获得未经授权的根访问权限,并且不会授予完全的可移植性。«@Andersjöqvist,所以您认为/usr/bin/env比/bin/bash更容易访问/当/bin始终位于根目录中时,甚至可能不会安装usrpartition@knittl我以前听过,到目前为止还没有人能向我解释为什么这是一个问题。我遵循了你引用的句子中的参考链接,但我不认为该链接讨论了这一问题。该页面所说的是,您不应该让用户定义自己的环境变量。但是,如果用户已经安装了恶意脚本并更改了环境变量,该怎么办?为什么他需要利用另一个程序来运行他的脚本?他还不如自己动手。无论如何,一切都是在他的权限下运行的。@Ineu是的,我认为/usr/bin/env比/bin/bash更有可能出现在那里,尽管我知道情况并非总是如此。在我的系统中,bash位于/usr/local/bin/bash中。我应该从/bin/bas创建符号链接吗 h、 也许吧?请注意,即使是您应该使用的状态/usr/bin/env-python,甚至不承认还有其他方法。