
Можно использовать shebang
строку, чтобы указать интерпретатор, который будет использоваться для выполнения скрипта:
#!/bin/bash
echo "Hello world"
Мой вопрос в том, как мы можем определить в скрипте, какой интерпретатор действительно используется. Следующее не работает:
echo $0
echo $SHELL
решение1
Если я правильно вас понял, то вы хотите извлечь оболочку из первой строки скрипта.
При использовании $SHELL
вы указываете фактически используемую оболочку, которая не обязательно должна совпадать с той, что указана в первой строке: например, вы можете использовать команду .
/ source
для запуска любого скрипта в любой запущенной в данный момент оболочке.
Ниже будет показана оболочка из первой строки:
sed -n '1 s/^#!//p' "$0"
Вот $0
работающий скрипт, и sed
команда печатает первую строку с #!
удаленным лидирующим символом. Если такой строки нет, то ничего не будет возвращено, и вы можете это проверить.
Вы можете использовать $(...)
для получения значения из sed
команды, например:-
echo Script "$0" is running with "$SHELL"
echo It should run with "$(sed -n '1 s/^#!//p' "$0")"
решение2
Использовать:
echo $(readlink -e /proc/$$/exe)
(другими словами, проверьте исполняемый файл на наличие вашего собственного процесса).
Редактировать: Кажется, $SHELL
это ненадежно. Поместите это в idshell
файл:
echo I am process $$
echo SHELL is $SHELL
echo /proc/$$/exe is $(readlink -e /proc/$$/exe)
а затем сравните результаты:
>bash idshell
I am process 24012
SHELL is /bin/bash
/proc/24012/exe is /bin/bash
и
>dash idshell
I am process 24062
SHELL is /bin/bash
/proc/24062/exe is /bin/dash
Так что, dash
это ложь??? (и это так, sh
поскольку это разрешается dash
на моем Ubuntu).