Отказано в доступе к скрипту Bash и плохой интерпретатор


8

Я на Кали Линукс 64 бит.

Я создал скрипт Python, который принимает 2 аргумента для запуска. Я не хочу каждый раз набирать одни и те же пути или искать в истории команд, которые я использовал в терминале. Поэтому я решил создать простой скрипт, который вызывает скрипт python со своими аргументами.

#! /bin bash

python CreateDB.py ./WtfPath ./NoWtfPath/NewSystem/

Это та же самая команда, которую я использовал бы в терминале. Тем не менее, я получаю сообщение об ошибке при попытке выполнить файл сценария.

bash: ./wtf.sh: /bin: bad interpreter: Permission denied

wtf.sh имеет права на выполнение.

Что не так?

Ответы:


10

У вас есть пробел вместо косой черты здесь:

#! /bin bash

Должно быть:

#! /bin/bash

или просто

#!/bin/bash

(первый пробел необязательный). После shebang ( #!) должен следовать путь к исполняемому файлу , за которым может следовать один аргумент , например,

#!/usr/bin/env sh

В этом случае /usr/bin/envэто исполняемый файл; смотрите man envдля деталей.

Просто /binотносится к каталогу.


блин, глупый я! Спасибо! Не видел этого ...
Давлог

1
Возможно, вы захотите привыкнуть использовать #!/bin/sh(вместо #!/bin/bash), если вы не знаете, что вы используете bashфункции.
G-Man говорит: «Восстановите Монику»

@ G-Man Спасибо, что немного почистил. WRT bash против sh, я просто следовал шаблону из вопроса (хотя моя тенденция - использовать только shтогда, когда я знаю, что не использую функции bash).
Златовласка

В терминале Ubuntu which bashэто полезно. Это возвращается /bin/bash. Вверху моего Bash-скрипта я добавляю #!/bin/bash. Затем, когда я хочу запустить скрипт Bash, я вхожу bash foo.sh. Так which shиспользуется так же. sh foo.sh
noobninja

1
@ G-Man, в обычном мире есть несчастное количество людей, которые не знают , используют ли они функции Bash или нет. Во многих случаях предпочтительнее иметь скрипт, который вообще не запускается (потому что Bash указан в shebang, но отсутствует), а не запускать и делать что-то неожиданное (потому что /bin/shэто что-то отличное от Bash, и в скрипте есть незаметные Bashisms). Посмотреть здесь.
Wildcard

1

Стоит отметить, что если точка монтирования, в которой находится ваш скрипт, имеет атрибут «noexec», то вы можете отбрасывать все, что хотите, и это все равно не будет работать, но вызов интерпретатора со сценарием в качестве аргумента будет продолжаться (до тех пор, пока который, в свою очередь, не пытается запустить другой скрипт на монтировании noexec).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.