【问题标题】:Shell: tar exit code 126外壳:tar 退出代码 126
【发布时间】:2018-06-23 18:56:12
【问题描述】:

所以我这里有这个脚本叫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 脚本到底出了什么问题?为什么它给出一个非零的退出代码?

【问题讨论】:

  • 你误用了$()
  • 我应该改用什么?

标签: bash shell wget tar gzip


【解决方案1】:

您误用了@987654321@ 语法。

命令替换重新分配命令 [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

【讨论】:

  • 啊,谢谢!这么小的语法错误让我很头疼
  • @SamsonClose 你可以查看man tar,发现错误码只能是0、1或2,这说明错误码126与tar无关。
  • 由于缺少引号,这里仍然存在一些错误。如果$1$FILE 包含空格,则会将其拆分为多个参数。正确的代码应该是 wget "$1" -O "$FILE"tar xvzf "$FILE"(好吧,best-practices 代码也不会将变量命名为 FILE;全大写名称用于对 shell 有意义的变量,而小写名称保证应用程序重新定义是安全的;请参阅pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,第四段)。
  • ...另外,请不要链接 ABS——它是 bash 的 W3Schools,充满了不良实践示例和过时的信息。 The bash-hackers' wikiBashGuide 是更好的资源;对于前者的退出状态,请参阅wiki.bash-hackers.org/dict/terms/exit_status
  • @CharlesDuffy 让我震惊的是“ABS 是 bash 的 W3Schools”。我会记住你的警告。谢谢你。但是我无法获得足够的信息来更新我的答案,因为 bash-hackers 的 wiki 可能在我的国家暂时关闭或被禁止。
猜你喜欢
  • 2013-10-01
  • 2017-02-08
  • 2019-04-27
  • 1970-01-01
  • 2017-11-12
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多