Насколько мне известно, для определения текущей оболочки мы используем echo $0
в оболочке. Скорее я хочу, чтобы мой скрипт проверял, в какой оболочке он работает. Итак, я попытался напечатать $0
в сценарии, и он возвращает имя сценария, как и должно. Итак, мой вопрос: как я могу определить, в какой оболочке работает мой скрипт во время выполнения?
22
echo $0
здесь не вариант, так как скрипт будет работать на разных машинах, где первое, что мне нужно проверить, это оболочка.#! /bin/sh -
сверху, он будет работатьsh
. Вы имеете в виду, что это за вариантsh
?Ответы:
На Linux вы можете использовать
/proc/PID/exe
.Пример:
источник
/bin/sed -r -e 's/\x0.*//' /proc/$$/cmdline
вместо этого выдает zsh или ksh. (Это было бы $ 0, если оболочка волшебным образом не исправила это, чтобы вместо этого дать имя сценариям)./proc
настолько же уродлив и непереносим, насколько это возможно./proc
не «некрасиво»./proc
часто очень элегантное решение. Непереносимый да, но потому, что что-то непереносимо, не делает его уродливым./proc
уродливым, потому что файлы в нем могут приходить и уходить по прихоти разработчиков, а содержимое файлов может изменяться без предварительного уведомления, вызывая бесконечные боли из-за битрота и перемещения целевых форматов файлов.Может быть, не то, что вы просите, но это должно работать до некоторой степени, чтобы идентифицировать переводчика, который в настоящее время интерпретирует его для таких как Томпсон (ош), Борн, Борн-снова (баш), Корн (ksh88, ksh93, pdksh, mksh ), zsh, совместимый с политикой обычный (шикарный), еще один (yash), rc, akanga, es shell, wish, tclsh, ожидаемый, perl, python, ruby, php, JavaScript (по крайней мере, nodejs, оболочка SpiderMonkey и JSPL) , MS / Wine cmd.exe, command.com (MSDOS, FreeDOS ...).
Я опубликовал первоначальную версию сценария which_interpreter примерно в 2004 году в сети Usenet. У Sven Mascheck есть (возможно, более полезный для вас) скрипт, называемый whatshell, который фокусируется на идентификации оболочек типа Bourne. Вы также можете найти слитую версию наших двух сценариев там .
источник
print
его на функцию.bash 3.2.53(1)-release
что интерпретатор интерпретирует его.Это то, что я использую в своем .profile для проверки наличия различных оболочек в системах, над которыми я работаю. Он не делает четких различий между ksh88 и ksh93, но никогда не подводил меня.
Обратите внимание, что не требуется ни одной вилки или трубы.
источник
ksh93
имеют$KSH_VERSION
. Эта переменная пришлаpdksh
и не попала в AT & T ksh88.FCEDIT
.posh
(pdksh с большинством не-POSIX-функций удален, так что вы, вероятно, захотите назвать его «sh») не имеет ни FCEDIT, ни KSH_VERSION, но имеет PS3 (возможно, не долго), хотя вряд ли он будет использоваться в качестве оболочки для входа в систему , Также обратите внимание, что приведенный выше код не будет отражать, находитсяbash
илиzsh
нетsh
режим эмуляции, что может быть проблемой, если вы используете,$PROFILE_SHELL
чтобы решить, следует ли включить ту или иную функцию. Смотрите также Whatshell от Sven Mascheck, чтобы узнать, что вы можете (а можете и не захотеть) проверить.Вы могли бы попробовать
который даст вам имя команды, связанной с pid скрипта.
источник
cmd
наcomm
POSIXifying ответ.Если в
lsof
вашей системе есть команда, вы можете получить полный путь к исполняемому файлу родительской оболочки, получив родительский PIDps
и проанализировав результатlsof -p $ppid
(см. Как определить текущую оболочку, над которой я работаю? ).источник
/
, если я использую,NR==4
я получаю путь к родителю оболочки.sh
есть$PPID
переменная. НаLinux
, вы можете использоватьreadlink -f "/proc/$PPID/exe"
.Вне земли Linux или отсутствия доступа к файловой системе / proc или эквивалентной, вы можете использовать pstree:
Если у вас есть пид
На Mac:
На коробке Linux:
Формат и стиль вывода из pstree различаются в зависимости от вашей среды, но вы можете включить вывод ASCII, а затем sed / tr / awk / etc. отфильтруйте вывод, чтобы получить оболочку, на которой выполняется скрипт.
Итак, очищенная выходная версия (работает для Mac или Linux OS работает):
На бегу дает:
И при запуске с другой оболочкой:
Урожайность:
Нет корневой или специальной файловой системы не требуется. Обратите внимание, моя фильтрация предполагает, что двоичное имя оболочки заканчивается на sh и что нет промежуточных записей, заканчивающихся на sh. Также предполагается, что вы не назвали свой скрипт "sh" или какой-то неудачный шаблон grep, который уничтожит информацию. :) Потребуется некоторая настройка для вашей собственной среды, чтобы обеспечить более высокую степень защиты от неправильного обращения.
источник
Вы можете использовать команду:
выяснить оболочку из скрипта.
источник
$SHELL
это оболочка по выбору пользователя. Инициализируется из логина оболочки пользователя. Ничего общего с текущей запущенной оболочкой.