Shell: tar 退出代码 126

Shell: tar exit code 126

所以我这里有这个脚本 updaterct2.sh

#!/bin/bash
FILE="./newopenrct2.tar.gz"
$(wget  -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  -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 脚本到底出了什么问题?为什么它给出非零退出代码?

您错误地使用了 <a href="http://www.tldp.org/LDP/abs/html/commandsub.html" rel="nofollow noreferrer">$()</a> 语法。

Command substitution reassigns the output of a command [1] or even multiple commands; it literally plugs the command output into another context. [2]

classic form of command substitution uses backquotes (`...`). Commands within backquotes (backticks) generate command-line text.

$(...) form has superseded backticks for command substitution.

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

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

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

错误码126,其实是执行目录的错误,见Exit Codes With Special Meanings

126 Command invoked cannot execute

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

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