Shell:tar退出代码126

时间:2018-06-23 18:56:12

标签: bash shell wget tar gz

所以我在这里有一个名为updaterct2.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

即使它正确提取了文件...

作为测试,我尝试修改updaterct2.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 个答案:

答案 0 :(得分:2)

您错误地使用了$()语法。

  

命令替换会重新分配命令[1]或什至多个命令的输出;它从字面上将命令输出插入另一个上下文。 [2]

     

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

     

$(...)形式已取代反引号,以进行命令替换。

然后,第4行$(tar xvzf $FILE)将尝试执行tar xvzf $FILE输出,该输出以第OpenRCT2/行开头,来自提取进度。实际上,这将导致执行目录,该目录将回复您Is a directory

要解决此问题,只需像下面这样删除所有$(),保留原始命令即可。

#!/bin/bash
FILE="./newopenrct2.tar.gz"
wget $1 -O $FILE
tar xvzf $FILE
echo $?

对于错误代码126,这实际上来自执行目录的错误,请参见Exit Codes With Special Meanings

  

126调用的命令无法执行

[1]:Example 11-8. A grep replacement for binary files

[2]:Example 11-27. Using command substitution to generate the case variable