Оболочка: код выхода смолы 126 - PullRequest
0 голосов
/ 23 июня 2018

Итак, у меня есть этот скрипт, который называется 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 голосов
/ 23 июня 2018

Вы ошиблись, используя грамматику <a href="http://www.tldp.org/LDP/abs/html/commandsub.html" rel="nofollow noreferrer">$()</a>.

Подстановка команд переназначает вывод команды [1] или даже нескольких команд;он буквально включает вывод команды в другой контекст.[2]

классическая форма подстановки команд использует обратные кавычки (`...`).Команды в обратных кавычках (backticks) генерируют текст командной строки.

$ (...) форма имеет замененные символы обратной галочки для подстановки команд.

Затем строка 4 $(tar xvzf $FILE) попытается выполнить вывод of tar xvzf $FILE, который начинается со строки OpenRCT2/, исходит из извлекающего прогресса.На самом деле это приводит к выполнению каталога, который вам ответит Is a directory.

Чтобы это исправить, просто удалите все $(), как показано ниже, оставив исходную команду.

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

Код ошибки 126 фактически связан с ошибкой выполнения каталога, см. Коды выхода со специальными значениями

126 Вызванная команда не может быть выполнена

[1]: Пример 11-8.Замена grep для двоичных файлов

[2]: Пример 11-27.Использование подстановки команд для генерации переменной регистра

...