Это содержимое test.sh:

#!/bin/bash
echo "test me"

Выполнить с помощью bash test.sh , нет проблем. Но для выполнения с ./test.sh возникает ошибка:

bash: ./test.sh: Permission denied

chmod u+x test.sh может заставить его работать с ./test.sh .

Я хочу знать причину: почему нет необходимости добавлять chmod u+x test.sh когда он выполняется с помощью bash test.sh?

И зачем нужно добавлять chmod u+x test.sh когда его выполнять с ./test.sh?

2 ответа2

1

Когда вы запускаете его с помощью bash test.sh вы явно указываете bash загрузить и запустить test.sh Файл нужно только прочитать, чтобы «запустить» с помощью этого метода. Но если вы просто запустите файл с ./test.sh , он не запустится, потому что у файла нет явных разрешений на выполнение; просто прочитайте разрешения.

Это означает, что в первом случае test.sh загружается bash . Но сами по себе системы Unix/Linux не будут запускать файлы по умолчанию. И после этого, если вы удалите этот начальный #!/bin/bash из ./test.sh и попробуйте запустить его даже с разрешениями на выполнение, он не запустится, так как система не будет знать, что делать с командами под ним.

А если вам интересно, когда файлы не получают автоматически права на выполнение при создании? Что ж, это долгий разговор, но в основном выполнение чего-то подобного создаст новую поверхность атаки в вашей системе. Если кто-то может войти в вашу систему и просто выполнить файлы, записав их, это очень большая проблема.

1

В отличие от операционных систем на основе CP/M, таких как DOS и Windows, Unix не использует имена файлов, чтобы указать, какие файлы являются исполняемыми.

Если вы хотите запустить файл с помощью вызова операционной системы execvpe() или присвоить ему имя в командной строке, ему нужно разрешение на выполнение

Пока он имеет установленный бит исполнения, вы называете его как хотите, например: trump.gif или foo-script (но test не является хорошим примером, поскольку уже есть команда с таким именем)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .