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可能会暂时关闭或在我的国家被禁止。