Bash: `chmod a x` Не работает при запуске внутри скрипта

#bash #chmod #permission-denied

#bash #chmod #отказано в разрешении

Вопрос:

Я пытаюсь имитировать процесс обновления с помощью скрипта.

Меня интересует только код выхода скрипта обновления ( 0 для успеха и любое другое значение для сбоя).

Я создал простой скрипт с именем update.sh для имитации обновления:

 #!/bin/bash

# 1=true, 0=false
success=1

if [ $success -eq 1 ] ; then
    # Success.
    exit 0
else
    # Failure.
    exit 1
fi
  

Чтобы имитировать загруженное обновление, я заархивировал update.sh в файл с именем update-file.zip .

Мой основной скрипт извлекает update-file.zip и запускает update.sh :

 #!/bin/bash

# Create a fresh update folder.
rm -rfv /test/update amp;amp; mkdir /test/update

# Simulate download by copying zip file to that folder.
cp -rf /update-file.zip /test/update/

cd /test/update
unzip -o update-file.zip

# Make the update script executable.
updateFile="/test/update/update.sh"
chmod a x $updateFile

# Run the update.
/test/update/update.sh

if [ $? -ne 0 ] ; then
    echo "update failed"
else
    echo "update success"
fi

# Delete update folder.
rm -rfv /test/update
  

Однако, когда я запускаю свой основной скрипт (даже с sudo ), я получаю следующее сообщение об ошибке:

 /test/update/update.sh: Permission denied
  

Даже использование сервиса (который использует root для выполнения всего) не помогло, так как я все еще получал то же сообщение об ошибке.

Кажется, что chmod a x не работает при запуске внутри скриптов, потому что, если я запускаю chmod a x /test/update/update.sh на терминале, все работает нормально.

Всякий раз, когда chmod a x запускается из скрипта, я получаю ошибки «Отказано в разрешении» при попытке запустить затронутый скрипт.

Что меня озадачивает, так это то, что при запуске ls -l /test/update/update.sh я получаю следующее:

 -rwxrwxrwx 1 root root 131 Sep  9  2020 /test/update/update.sh
  

Результат один и тот же, независимо от того, chmod a x выполняется из терминала или скрипта.

Я включен Ubuntu Server 20.04.1 LTS (Focal Fossa) .

Комментарии:

1. Пожалуйста, попробуйте cat -v /test/update/update.sh из вашего скрипта раньше /test/update/update.sh и подтвердите, что это действительно содержимое вашего скрипта?

2. Хорошо, дай мне несколько минут.

3. Также, пожалуйста, проверьте, нет ли в вашем файле окончаний строк dos. Работает ли явный запуск bash /test/update/update.sh ?

4. Также проверю ваш второй комментарий и вернусь с результатами. 🙂

5. @KamilCuk Я немного смущен результатами. Добавление cat -v /test/update/update.sh по какой-то причине решило проблему. Затем я удалил это и попробовал bash /test/update/update.sh , что также решило проблему. Я выберу этот bash вариант, потому что это имеет больше смысла, но мне интересно, почему он сработал, несмотря на то, что #!/bin/bash уже присутствует в update.sh . Также, пожалуйста, добавьте это в качестве ответа, чтобы я мог его принять. 🙂

Ответ №1:

Вы можете явно запустить интерпретатор для файла:

 bash /test/update/update.sh
  

Тогда нет необходимости делать файл исполняемым.

Ответ №2:

Не могли бы вы использовать

/bin/bash /test/update/update.sh

вместо

/test/update/update.sh

в скрипте.

Не могли бы вы также один раз предоставить вывод приведенной ниже команды.

ls -ld / тест / обновление

Комментарии:

1. Привет, спасибо за ваш ответ! Это тоже должно сработать, но я уже принял предыдущий ответ ранее. Большое спасибо, что поделились! 🙂