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
所以我这里有这个脚本 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