Bash Shell:tar出口代码126

Bash Shell:tar出口代码126,bash,shell,wget,tar,gzip,Bash,Shell,Wget,Tar,Gzip,所以我在这里有一个脚本,名为updatert2.sh #!/bin/bash FILE="./newopenrct2.tar.gz" $(wget $1 -O $FILE) $(tar xvzf $FILE) echo $? /newopenrct2.tar.gz中唯一的文件是一个名为OpenRCT2的文件夹,其中包含所有内容。运行此脚本将生成 ./updaterct2.sh: line 4: OpenRCT2/: Is a directory 126 即使它正确地提取了文件 作为测试,我尝

所以我在这里有一个脚本,名为
updatert2.sh

#!/bin/bash
FILE="./newopenrct2.tar.gz"
$(wget $1 -O $FILE)
$(tar xvzf $FILE)
echo $?
/newopenrct2.tar.gz
中唯一的文件是一个名为
OpenRCT2
的文件夹,其中包含所有内容。运行此脚本将生成

./updaterct2.sh: line 4: OpenRCT2/: Is a directory
126
即使它正确地提取了文件

作为测试,我尝试修改
updatert2.sh
来创建目录

#!/bin/bash
FILE="./newopenrct2.tar.gz"
DIR="./OpenRCT2"
$(wget $1 -O $FILE)
$(tar xvzf $FILE -C $DIR)
echo $?
但它仍然产生同样的结果

在终端中运行命令

wget http://cdn.limetric.com/games/openrct2/0.2.0/develop/2e36253/9/OpenRCT2-0.2.0-develop-2e36253-linux-x86_64.tar.gz -O ./newopenrct2.tar.gz
tar xvzf ./newopenrct2.tar.gz
工作时没有任何错误和输出

./newopenrct2.tar.g 100%[===================>]  33.16M  9.96MB/s    in 3.7s
...
OpenRCT2/
OpenRCT2/doc/
OpenRCT2/doc/changelog.txt
OpenRCT2/doc/licence.txt
OpenRCT2/doc/readme.txt
...
我认为权限不应该是一个问题,它们如下

-rw-rw-r--   newopenrct2.tar.gz
-rwxrwxr-x   updaterct2.sh

bash脚本到底出了什么问题?为什么它会给出非零退出代码?

您错误地使用了
语法

命令替换重新分配一个命令[1]甚至多个命令的输出;它将命令输出插入到另一个上下文中。[2]

命令替换的经典形式使用反引号(`…`)。反引号(反勾号)中的命令生成命令行文本

$(…)表单已取代了用于命令替换的反勾号

然后,第4行
$(tar xvzf$FILE)
将尝试执行
tar xvzf$FILE
的输出,该输出以行
OpenRCT2/
开始,来自提取过程。实际上,这会导致执行一个目录,该目录回答您
是一个目录

要解决这个问题,只需像下面这样删除所有
$()
,保留原来的命令

#!/bin/bash
FILE="./newopenrct2.tar.gz"
wget $1 -O $FILE
tar xvzf $FILE
echo $?
对于错误代码
126
,这实际上来自执行目录的错误,请参阅

126调用的命令无法执行

[1] :


[2] :

您错误地使用了
语法

命令替换重新分配一个命令[1]甚至多个命令的输出;它将命令输出插入到另一个上下文中。[2]

命令替换的经典形式使用反引号(`…`)。反引号(反勾号)中的命令生成命令行文本

$(…)表单已取代了用于命令替换的反勾号

然后,第4行
$(tar xvzf$FILE)
将尝试执行
tar xvzf$FILE
的输出,该输出以行
OpenRCT2/
开始,来自提取过程。实际上,这会导致执行一个目录,该目录回答您
是一个目录

要解决这个问题,只需像下面这样删除所有
$()
,保留原来的命令

#!/bin/bash
FILE="./newopenrct2.tar.gz"
wget $1 -O $FILE
tar xvzf $FILE
echo $?
对于错误代码
126
,这实际上来自执行目录的错误,请参阅

126调用的命令无法执行

[1] :


[2] :

您错误地使用了
$()
。我应该用什么来代替?您错误地使用了
$()
。我应该用什么来代替?啊,谢谢!我对这么一点语法感到非常头疼error@SamsonClose您可以查看
man tar
,发现错误代码只能是0、1或2,这表明错误代码126与
tar
无关。由于缺少引号,此处仍存在一些错误。如果
$1
$FILE
包含空格,则会将其拆分为多个参数。正确的代码应该是
wget“$1”-O“$FILE”
tar xvzf“$FILE”
(好吧,最佳实践代码也不会将变量命名为
FILE
;所有大写名称都用于对shell有意义的变量,而小写名称则保证应用程序可以安全地重新定义;请参见第四段)……此外,请不要链接ABS——这是bash的W3Schools,充满了糟糕的实践示例和过时的信息。而这些都是更好的资源;关于前者的退出状态,请参阅@CharlesDuffy震惊地告诉我“ABS是bash的核心”。我会记住你的警告。非常感谢。然而,我无法获得足够的信息来更新我的答案,因为bash黑客的wiki可能会暂时关闭或在我的国家被禁止。啊,谢谢!我对这么一点语法感到非常头疼error@SamsonClose您可以查看
man tar
,发现错误代码只能是0、1或2,这表明错误代码126与
tar
无关。由于缺少引号,此处仍存在一些错误。如果
$1
$FILE
包含空格,则会将其拆分为多个参数。正确的代码应该是
wget“$1”-O“$FILE”
tar xvzf“$FILE”
(好吧,最佳实践代码也不会将变量命名为
FILE
;所有大写名称都用于对shell有意义的变量,而小写名称则保证应用程序可以安全地重新定义;请参见第四段)……此外,请不要链接ABS——这是bash的W3Schools,充满了糟糕的实践示例和过时的信息。而这些都是更好的资源;关于前者的退出状态,请参阅@CharlesDuffy震惊地告诉我“ABS是bash的核心”。我会记住你的警告。非常感谢。然而,我无法获得足够的信息来更新我的答案,因为bash黑客的wiki可能会暂时关闭或在我的国家被禁止。