Шебанг, переводчик и сценарий

Шебанг, переводчик и сценарий

Можно использовать 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).

Связанный контент