Можно использовать строку shebang для предоставления интерпретатора для выполнения скрипта:

#!/bin/bash
echo "Hello world"

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

echo $0
echo $SHELL

2 ответа2

0

Если я вас правильно понял, то вы хотите извлечь оболочку из первой строки скрипта.

Когда вы используете $SHELL вы показываете оболочку, которую вы на самом деле используете, которая не должна совпадать с той, которая указана в первой строке: например, вы можете использовать use . Команда /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")"
0

Использование:

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).

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