2013-03-15 1 views
1

я соединили следующее обнаружить, если запущен скрипт на Bash или нет:Detect ли сценарий руководят Bash

################################################################################ 
# Checks whether execution is going through Bash, aborting if it isn't. TinoSino 

current_shell="$(
    ps     `# Report a snapshot of the current processes` \ 
     -p $$   `# select by PID` \ 
     -o comm   `# output column: Executable namename` \ 
    |\ 
    paste    `# Merge lines of files ` \ 
     -s    `# paste one file at a time instead of in parallel` \ 
     -    `# into standard output` \ 
    |\ 
    awk     `# Pick from list of tokens` \ 
     '{ print $NF }' `# print only last field of the command output` 
)" 

current_shell="${current_shell#-}" # Remove starting '-' character if present 

if [ ! "${current_shell}" = 'bash' ]; then 

    echo "This script is meant to be executed by the Bash shell but it isn't." 
    echo 'Continuing from another shell may lead to unpredictable results.' 
    echo 'Execution will be aborted... now.' 

    return 0 

fi 

unset current_shell 
################################################################################ 

Я не прошу вас конкретно к проверке кода потому, что вы бы отправьте меня в CodeReview; мой вопрос:

  • как бы вы о тестирования ли это «исполнение охранник» поставили в верхней части моего сценария действительно делать свою работу надежно?

Я думаю об установке виртуальных машин и на каждую машину, чтобы установить такие вещи, как zsh, csh и т.д. Но это выглядит слишком много времени для меня. Лучшие способы сделать это?

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

+0

Как вы начали свой сценарий? './foo.sh' или' bash foo.sh' или 'sh foo.sh'? (предположим, что в том же каталоге) – Kent

ответ

6

Это лучше написано как

if [ -z "$BASH_VERSION" ] 
then 
    echo "Please run me in bash" 
    exit 1 
fi 

Что касается тестирования, получить список не-Баш оболочек из/и т.д./оболочек, а просто запустить скрипт с каждым из них проверить, что вы получите ваше сообщение об ошибке ,

+0

И это гарантированно не будет экспортировано в подоболочки, вызванные Bash? – Robottinosino

+0

На части вопроса ответили: прочитайте '/ etc/shells', о существовании которых я не знал. Благодарю. Я не уверен в вашей '-z" $ BASH_VERSION ", хотя, возможно, я ошибаюсь. Ах, и выход слишком жесткий, я думаю, что лучше вернуться. – Robottinosino

+0

По умолчанию это не происходит. Ничто теоретически не мешает вам экспортировать переменную BASH_VERSION в другую оболочку, точно так же, как ничто не останавливает вас от символьной привязки к bash, чтобы победить ваш оригинальный скрипт. –

2

Я хотел бы только рекомендовать качению свой собственный, если это не критично, чтобы "гарантировать" правильные результаты. Я не думаю, что такая гарантия даже возможна, но большую часть времени вы ориентируетесь на несколько оболочек и заботитесь только о современных версиях. Очень немногие люди должны даже заботиться об обнаружении версий. Написание переносимого кода при выходе за пределы POSIX требует знания того, что вы делаете.

Не беспокойтесь, обнаружив оболочку, чтобы ее прервать. Если люди хотят стрелять в ногу, не обращая внимания на шэбанг, это их проблема.

+0

Re: глупо катиться самостоятельно -> вы абсолютно правы. Любой из этих сценариев входит в пакеты APT для Ubuntu, о которых вы знаете? (Я проверил 'dpkg-query -S'). Я должен просто использовать проверенные и проверенные скрипты. Не соглашайтесь с тем, «позволяя им стрелять в ногу». Приобретайте, чтобы вознаградить идею: используйте то, что уже есть. Просто нужно выяснить, как развернуть его с согласованностью .. (например, дистрибутив пакета) – Robottinosino

+0

that_interpreter заставляет мои глаза болеть. – jordanm

Смежные вопросы