Как определить текущую оболочку, над которой я работаю

Как определить текущую оболочку, над которой я работаю

25.07.2010 01:35:28 Просмотров 33 Источник

Как я могу определить текущую оболочку, над которой я работаю?

Будет ли достаточно одного вывода команды ps?

Как это можно сделать в разных вариантах Unix?

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on#comment3450170_3327013
@msw = +1. (см. мой ответ на возможные подходы к тест)
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on#comment17728336_3327013
@msw: похоже, хороший комментарий, но он оставляет меня в недоумении: "как?".
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on#comment17728546_3327013
Похоже, что на этот вопрос нет простого ответа. Если мы не можем запросить оболочку, возможно, лучший подход-всегда указывать оболочку. Я не уверен, что это всегда возможно, но, возможно, это легче сделать, чем обычно думают люди.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on#comment33212263_3327013
Это может помочь ...> > opensourceforgeeks.blogspot.in/2013/05/…

Ответы - Как определить текущую оболочку, над которой я работаю / How to determine the current shell I'm working on

Является ответом!
DVK

25.07.2010 01:37:34

  • Существует три подхода к поиску имени исполняемого файла текущей оболочки:

    Обратите внимание , что все три подхода можно обмануть , если исполняемый файл оболочки /bin/sh, но на самом деле это переименованный bash, например (что часто случается).

    Таким образом, на ваш второй вопрос о том, будет ли ps-выведет имя программы... что в случае с оболочкой и есть настоящая оболочка.

  • echo $0 - это будет выглядеть для текущего идентификатора процесса в списке запущенных процессов. Поскольку текущий процесс является оболочкой, он будет включен.

    Это не 100% Надежный, как вы могли бы других , чьи процессы ps -ef | grep $$ | grep -v grep список включает в себя такое же количество, как оболочки идентификатор процесса, особенно если это небольшое количество (например, если оболочки ПИД "5", можно обнаружить процессов под названием "с java5" или "perl5" в тот же ps выход!). Это вторая проблема с подходом "ps", Помимо невозможности полагаться на имя оболочки.

  • grep-путь к текущей оболочке сохраняется как переменная echo $SHELLдля любой оболочки. Предостережение для этого состоит в том, что если вы запускаете оболочку явно как подпроцесс (например, это не ваша оболочка входа), вы получите значение вашей оболочки входа. Если это возможно, используйте SHELLили ps.


  • Если, однако, исполняемый файл не соответствует вашей фактической оболочке (например$0на самом деле bash или ksh), вам нужна эвристика. Вот некоторые переменные среды, характерные для различных оболочек::

    • /bin/sh находится в tcsh

    • $version на баш

    • $BASH(нижний регистр) имеет значение фактического имени оболочки в csh или tcsh

    • $shellустанавливается на zsh

    • ksh имеет $ZSH_NAMEи $PPID, в то время как обычный Bourne shell ( $PS3) имеет только shи $PS1. Это обычно кажется самым трудным для различения - единственное различие во всем наборе переменных окружения между $PS3и sh, которые мы установили на Solaris boxen, - это ksh, $ERRNO, $FCEDIT, $LINENO, $PPID, $PPID, $PS4, $RANDOMи $SECONDS.

https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment3450279_3327022
${. SH. version} устанавливается на ksh93
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment3450319_3327022
ps -p $$, как указывает Мэтью Слэттери . Для ksh: echo $KSH_VERSIONили echo ${.sh.version}.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment3450370_3327022
@Dennish - у моего ksh сейчас нет набора KSH_VERSION. и echo ${.sh.version}возвращает "плохую замену". Смотрите мое решение выше
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment3450386_3327022
@fpmurphy какой бы ksh мы ни установили на Solaris boxen на работе, очевидно, предшествует ksh93, поскольку у него нет этого набора. На самом деле, единственная разница во всем наборе экологических переменных между shи ksh-это $ERRNO, $FCEDIT, $LINENO, $PPID, $PS3, $PS4, $RANDOM, $SECONDS, $TMOUT.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment3460570_3327022
@DVK в настоящее время Solaris имеет сильно настроенную версию ksh88. POR должен переместиться в ksh93 для следующего выпуска. Видишь hub.opensolaris.org/bin/view/Project+ksh93-интеграция для получения дополнительной информации.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment31999128_3327022
Ничего из этого не работает, если вы пытаетесь получить доступ к типу оболочки из скрипта python.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment40884145_3327022
Это сбивает с толку: $ ps | grep sh25736 pts/1 00:00:00 sh25740 pts/1 00:00:00 bash... где /bin/bash-исполняемый файл, а /bin/shуказывает на dash
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment49662938_3327022
@Viks-это будет, если вы напишете скрипт оболочки, чтобы сделать это
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment52842621_3327022
В zsh echo $0выводит имя скрипта,а не имя оболочки.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment59288021_3327022
ps -ef | grep … ... это не 100% Надежный, как ...” с помощью простого регулярного выражения через egrep или grep -e можно легко довести надежность До для всех намерений и целей 100%: ps -ef | egrep "^\s*\d+\s+$$\s+". ^Гарантирует, что мы начинаем с начала строки, \d+съедает UID, $$соответствует PID, а \s*и \s+учитывают & обеспечивают пробелы между другими частями.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment69212117_3327022
для эвристики +1. Действительно полезный
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment70500594_3327022
@SlippD.Томпсон не работал в GNU / Linux. Но это, кажется, работает: ps -ef | awk '$2==pid' pid=$$
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327022#comment103794320_3327022
pgrepлучше подходит для грэппинга через процессы
karlphillip

25.07.2010 01:38:44

Вы можете попробовать:

ps | grep `echo $$` | awk '{ print $4 }'

Или:

echo $SHELL
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327026#comment22839302_3327026
В чем смысл grep, за которым следует awk, когда /pattern/ { action }будет делать?
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327026#comment31738646_3327026
# in zshell alias shell= ' echo ${SHELL: t}'
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327026#comment41376991_3327026
$SHELL, чем греппинг $$ из-за ложных срабатываний.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327026#comment52682086_3327026
Долларов оболочки ОКР. переменная указывает на "родительскую" оболочку, как указано в спецификации POSIX: SHELL эта переменная должна представлять путь к предпочтительному интерпретатору командного языка пользователя. Поэтому значение $SHELL не может быть текущей оболочкой.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327026#comment79631698_3327026
все в пределах awk, ps | awk '$1=='$$' { n=split($4,a,"/"); print a[n] }'
ennuikiller

25.07.2010 01:39:39

ПС-самый надежный метод. Переменная окружения оболочки не гарантируется, и даже если это так, ее можно легко подделать.

https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327027#comment3450154_3327027
+ 1 $SHELL-это оболочка по умолчанию для программ, которые должны порождать один. Он не обязательно отражает оболочку, которая в данный момент работает.
Moisei

25.07.2010 01:41:25

echo $$ # Gives the Parent Process ID 
ps -ef | grep $$ | awk '{print $8}' # Use the PID to see what the process is.

Откуда вы знаете, какова ваша текущая оболочка?.

https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327035#comment3450355_3327035
Это не родительский процесс-это текущий процесс.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327035#comment19649201_3327035
Использование grep $$ненадежно. ps -ef | awk -v pid=$$ '$2==pid { print $8 }'лучше, но почему бы просто не использовать ps -p $$?
Matthew Slattery

25.07.2010 02:09:37

ps -p $$

должно работать везде, где решения с участием ps -efи grepделают (на любом варианте Unix, который поддерживает параметры POSIX для ps), и не будет страдать от ложных срабатываний, введенных grepping для последовательности цифр, которые могут появиться в другом месте.

https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327108#comment3450333_3327108
Некоторые оболочки имеют собственную встроенную версию ps, которая может не понимать -p, поэтому вам может потребоваться использовать /bin/ps -p $$.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327108#comment3450400_3327108
Все раковины, с которыми я знаком, понимают $$, за исключением fish, с которой вам придется использовать ps -p %self.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327108#comment42137417_3327108
На самом деле, вы не должны полагаться на жесткие пути, такие как /bin/ps. psможет легко (на самом деле это вполне нормально в наши дни) быть установлен в /usr/bin. $(which ps) -p $$- это лучший способ. Конечно, это не сработает у рыб, а возможно и у некоторых других раковин. Я думаю, что это (which ps) -p %selfв рыбе.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327108#comment96619938_3327108
В некоторых минимальных системах, таких как контейнер debian-slim docker, ps может отсутствовать. В этом случае этот подход все еще работает: readlink /proc/$$/exe
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327108#comment100083786_3327108
если ваш shэмулируется bash, ps-p дает вам /usr/bin/bash, даже если вы запускаете его как sh
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3327108#comment100291819_3327108
$$- это идентификатор процесса самого скрипта . И ps $$уже работает во многих случаях.
zaga

25.07.2010 10:02:39

На Mac OS X (и FreeBSD):

ps -p $$ -axco command | sed -n '$p' 
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3330353#comment61662036_3330353
Попробовал это во время использования zsh, и это дало мне-bash.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/3330353#comment106252187_3330353
На моей системе (сейчас), протестированной с bash и dash, это возвращение mutt... :- b
Nahuel Fouilleul

19.06.2012 12:59:32

Попробуй

ps -p $$ -oargs=

или

ps -p $$ -ocomm=
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/11097703#comment33831633_11097703
Это очень короткая история. Я использовал сам ps -o fname --no-headers $$.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/11097703#comment43292605_11097703
Спасибо. Я нашел, что это лучший вариант для использования в скрипте, чтобы охранять Баш определенные команды test `ps -p $$ -ocomm=` == "bash" && do_something_that_only_works_in_bash. (Следующая строка в моем сценарии имеет эквивалент csh.)
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/11097703#comment83000217_11097703
Я обнаружил, что если вы делаете это из подрешетки, то это может привести к ложным дополнительным строкам, сопоставляя Родительский PID, а также фактический процесс оболочки. Для этого я использую -q вместо -p: SHELL=$(ps -ocomm= -q $$)
sr01853

15.10.2012 03:45:43

$SHELLне обязательно всегда показывать текущую оболочку. Он отражает только оболочку по умолчанию, которая будет вызвана.

Чтобы проверить вышесказанное, скажемbashявляется оболочкой по умолчанию, попробуйте echo $SHELL, а затем в том же терминале войдите в другую оболочку ( например, KornShell (ksh)) и попробуйте $SHELL. Вы увидите результат как баш в обоих случаях.

Чтобы получить имя текущей оболочки, используйте cat /proc/$$/cmdline. И путь к исполняемому файлу оболочки с помощью readlink /proc/$$/exe.

https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/12894962#comment27638145_12894962
... При условии, что у вас есть /proc.
carlo

20.03.2013 09:30:04

При условии, что ваш /bin/shподдерживает стандарт POSIX и в вашей системе установлена lsoflsof-возможной альтернативой lsofв этом случае может быть pid2path - вы также можете использовать (или адаптировать) следующий скрипт, который печатает полные пути:

#!/bin/sh
# cat /usr/local/bin/cursh
set -eu
pid="$$"

set -- sh bash zsh ksh ash dash csh tcsh pdksh mksh fish psh rc scsh bournesh wish Wish login

unset echo env sed ps lsof awk getconf

# getconf _POSIX_VERSION  # reliable test for availability of POSIX system?
PATH="`PATH=/usr/bin:/bin:/usr/sbin:/sbin getconf PATH`"
[ $? -ne 0 ] && { echo "'getconf PATH' failed"; exit 1; }
export PATH

cmd="lsof"
env -i PATH="${PATH}" type "$cmd" 1>/dev/null 2>&1 || { echo "$cmd not found"; exit 1; }

awkstr="`echo "$@" | sed 's/\([^ ]\{1,\}\)/|\/\1/g; s/ /$/g' | sed 's/^|//; s/$/$/'`"

ppid="`env -i PATH="${PATH}" ps -p $pid -o ppid=`"
[ "${ppid}"X = ""X ] && { echo "no ppid found"; exit 1; }

lsofstr="`lsof -p $ppid`" || 
   { printf "%s\n" "lsof failed" "try: sudo lsof -p \`ps -p \$\$ -o ppid=\`"; exit 1; }

printf "%s\n" "${lsofstr}" | 
   LC_ALL=C awk -v var="${awkstr}" '$NF ~ var {print $NF}'
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/15530657#comment85546146_15530657
это работает в рыбе! но для меня, не удается в bash, из-за-i(- >игнорировать окружение) опции > envв строке, где вы проверяете наличие lsof. это не удается с: env -i PATH="${PATH}" type lsof- > > env: ‘type’: No such file or directory
Peter Lamberg

31.03.2013 08:54:15

Если вы просто хотите убедиться, что пользователь вызывает скрипт с помощью Bash:

if [ ! -n "$BASH" ] ;then echo Please run this script $0 with bash; exit 1; fi
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/15731952#comment40505397_15731952
Этот должен быть ближе к вершине. Большое спасибо.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/15731952#comment41377274_15731952
Он не должен быть ближе к вершине, потому что он вообще не отвечает на вопрос. Если вопрос будет "как проверить, работает ли скрипт под bash", я голосую за него.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/15731952#comment75756423_15731952
@DawidFerenczy-этот вопрос является лучшим результатом, когда вы ищете эту фразу, хотя. В долгосрочной перспективе, я думаю, гораздо важнее, чтобы ответы отвечали на то, что люди ищут, а не на то, о чем был первоначальный вопрос.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/15731952#comment86725803_15731952
Кроме того, переменная $BASH определяется в разделе tcsh, если tcsh вызывается из bash
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/15731952#comment99517912_15731952
Это очень полезно, спасибо. Просто немного адаптировал его, поместив это как вторую строку после #!/bin/bash: if [ ! -n "$BASH" ] ;then exec bash $0; fi. С этой строкой скрипт запускается с использованием bash, даже если он запущен с использованием ksh или sh. Мой вариант использования не требует аргументов командной строки, но при необходимости их можно добавить после $0.
Ranjithkumar T

22.10.2013 02:26:08

Пожалуйста, используйте следующую команду:

ps -p $$ | tail -1 | awk '{print $4}'
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/19515220#comment41377782_19515220
Первый-это ерунда, zshделает то, что вы пытаетесь сделать, и делает это хорошо. Второй вариант также не подходит, поскольку $SHELLустановлен в качестве оболочки по умолчанию, выполните bashи zsh, он напечатает echo $SHELL.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/19515220#comment41406154_19515220
Вы правы Давид Ференци, мы можем использовать команду ps Для определения текущей оболочки. [ # ps-p $ $ / tail -1 | awk ' {print $4}' ].
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/19515220#comment65260314_19515220
echo $SHELL может быть дрянь: ~ $ echo $SHELL /bin/zsh ~ $ bash bash-4.3$ echo $SHELL /bin/zsh bash-4.3$
vadimbog

17.06.2014 02:44:25

Ниже всегда приводится фактическая используемая оболочка-она получает имя фактического исполняемого файла, а не имя оболочки (напримерksh93вместо kshи т. д.). Для /bin/shон покажет фактическую используемую оболочку, т. е. dash.

ls -l /proc/$$/exe | sed 's%.*/%%'

Я знаю, что многие говорятls

https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/24253329#comment41817331_24253329
Это просто ошибки на всех системах которые не обеспечивают /proc. Не весь мир-это линукс-бокс.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/24253329#comment57340410_24253329
И если вы находитесь на Linux, мы бы предпочли basename $(readlink /proc/$$/exe)ls+ sed+ echo.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/24253329#comment72641760_24253329
Это даст имя фактического исполняемого файла, а не фактической оболочки . Когда фактическая оболочки связан как с busybox апплет, скажем ash -> /bin/busybox, это даст как /bin/busybox версии.
Alex Dupuy

11.08.2014 09:38:09

Если вы просто хотите проверить, что вы используете (определенную версию) Bash, лучший способ сделать это-использовать $BASH_VERSINFO, вам также нужно проверитьsh.

В скрипте, который я написал, использует имена функций с $BASH(не подчеркивание) и зависит от ассоциативных массивов (добавлено в Bash 4), у меня есть следующая проверка здравомыслия (с полезным сообщением об ошибке пользователя):

/bash

Вы можете опустить несколько параноидальную функциональную проверку функций в первом случае и просто предположить, что будущие версии Bash будут совместимы.

https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/25821631#comment43289056_25821631
Я получаю sed: invalid option -- 'E'на bash 3.2.51 и tcsh 6.15.00
Dawid Ferenczy Rogožan

14.10.2014 03:57:50

Я перепробовал много разных подходов, и самый лучший для меня-это:

ps -p $$

Он также работает под Cygwin и не может давать ложных срабатываний, как PID grepping. С некоторой очисткой он выводит только имя исполняемого файла (под Cygwin с path):

ps -p $$ | tail -1 | awk '{print $NF}'

Вы можете создать функцию, так что вам не придется запоминать ее:

# Print currently active shell
shell () {
  ps -p $$ | tail -1 | awk '{print $NF}'
}

...а потом просто выполнить shell.

Он был протестирован под Debian и Cygwin.

https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/26360288#comment87949213_26360288
По состоянию на мою установку (Cygwin / Windows 7) Ваш ответ является лучшим, и ps-p $$ | tail -1 | gawk '{print $NF}' работает даже из cmd без $bash. Пожалуйста, обратите внимание поглазеть, а не на awk, как на awk работает только от Баш.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/26360288#comment96946963_26360288
@WebComer Извините, я не уверен, что вы подразумеваете под " работает даже из cmd без $bash ". Даже если у вас есть порты Windows ps, tailи gawk, cmd не определяет $$, поскольку это PID, поэтому он определенно не может работать под обычным cmd.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/26360288#comment106243694_26360288
Почему бы просто ps -p$$ -o comm=? POSIX говорит, что указание всех заголовков пустыми полностью подавляет заголовок. Мы все еще терпим неудачу (как и все ответы ps), когда мы исходим из непосредственно выполняемого сценария (например#!/bin/sh).
ajaaskel

30.10.2014 09:16:40

Греппинг PID из выходных данных " ps " не требуется, так как вы можете прочитать соответствующую командную строку для любого PID из структуры каталогов /proc:

echo $(cat /proc/$$/cmdline)

Тем не менее, это может быть не лучше, чем просто:

echo $0

Что касается запуска фактически другой оболочки, чем указано в названии, одна идея заключается в том, чтобы запросить версию из оболочки, используя имя, которое вы получили ранее:

<some_shell> --version

sh, кажется, терпит неудачу с кодом выхода 2, в то время как другие дают что-то полезное (но я не могу проверить все, так как у меня их нет):

$ sh --version
sh: 0: Illegal option --
echo $?
2
theoden8

09.07.2015 09:42:56

Это не очень чистое решение, но оно делает то, что вы хотите.

# MUST BE SOURCED..
getshell() {
    local shell="`ps -p $$ | tail -1 | awk '{print $4}'`"

    shells_array=(
    # It is important that the shells are listed in descending order of their name length.
        pdksh
        bash dash mksh
        zsh ksh
        sh
    )

    local suited=false
    for i in ${shells_array[*]}; do
        if ! [ -z `printf $shell | grep $i` ] && ! $suited; then
            shell=$i
            suited=true
        fi
    done

    echo $shell
}
getshell

Теперь вы можете использовать $(getshell) --version.

Это работает, однако, только на kornshell-подобных оболочках (ksh).

https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/31325724#comment65362721_31325724
- Но это работает только на КШ-подобных оболочках.- Вы хотите сказать, что я должен проверить оболочку, прежде чем запустить это? Хмм...
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/31325724#comment65368367_31325724
@jpaugh, списки должны поддерживаться оболочкой, использующей этот код, что не относится к dash, yashи т. д. Обычно, если вы используете bash, zsh, ksh, что угодно-вы не должны беспокоиться о таких вещах.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/31325724#comment65369054_31325724
Так ты считаешь Баша "КШ-подобным"? Понял. В этом больше смысла.
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/31325724#comment65369896_31325724
@jpaugh, ну, это то, что я имел ksh(хотя я не проверял это тщательно).
Matthew Stier

25.08.2015 04:37:28

Мой вариант печати родительского процесса:

ps -p $$ | awk '$1 == PP {print $4}' PP=$$

Не запускайте ненужные приложения, когда AWK может сделать это за вас.

user5659949

09.12.2015 06:34:54

У меня есть простой трюк, чтобы найти текущую оболочку. Просто введите случайную строку (которая не является командой). Он завершится неудачей и вернет ошибку" не найдено", но в начале строки он скажет, какая это оболочка:

ksh: aaaaa: not found [No such file or directory]
bash: aaaaa: command not found
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/34182762#comment66461460_34182762
Ничего хорошего в сценарии нет. echo 'aaaa' > script; chmod +x script; ./scriptдает./script.sh: 1: aaaa: not found
wickles

18.05.2017 02:13:09

Мое решение:

ps -o command | grep -v -e "\<ps\>" -e grep -e tail | tail -1

Это должно быть переносимо на различные платформы и оболочки. Он использует ps, как и другие решения, но он не полагается на sedили awkи отфильтровывает мусор из трубопроводов и ps) и fish (который не работает с большинством этих решений без изменения выражения специально для fish, потому что он использует другую переменную PID).

Devang Paliwal

19.09.2017 10:30:27

Существует много способов узнать оболочку и ее соответствующую версию. Вот несколько из них, которые работали на меня.

Простой

  1. $ > > echo $0 (дает вам имя программы. В моем случае выход был-Баш .)
  2. $> > $SHELL (это приведет вас в оболочку и в приглашении вы получите имя оболочки и версию. В моем случае баш3, 2$ .)
  3. $ > > echo $SHELL (Это даст вам исполняемый путь. В моем случае / bin / bash .)
  4. $> > $SHELL -- version (это даст полную информацию о программном обеспечении shell с типом лицензии)

Хакерский подход

$> ******* (Введите набор случайных символов,и на выходе вы получите имя оболочки. В моем случае-bash: chapter2-a-sample-isomorphic-app: команда не найдена)

martin zahrubsky

11.12.2017 07:38:00

Этот хорошо работает на Red Hat Linux (RHEL), macOS, BSD и некоторых AIXes:

ps -T $$ | awk 'NR==2{print $NF}' 

в качестве альтернативы, следующий должен также работать, если pstree доступен,

pstree | egrep $$ | awk 'NR==2{print $NF}'
Shiva

14.12.2017 11:12:15

Выполните следующие действия, чтобы узнать, использует ли ваша оболочка Dash/Bash.

ls –la /bin/sh:

  • если результат /bin/sh -> /bin/bash ==> тогда ваша оболочка используете bash.

  • если результатом является /bin/sh ->/bin/dash==>, то ваша оболочка использует Dash.

Если вы хотите перейти с Bash на Dash или наоборот, используйте приведенный ниже код:

ln -s /bin/bash /bin/sh(изменить оболочку на Bash)

Примечание: Если вышеприведенная команда приводит к ошибке, говорящей, что /bin/sh уже существует, удалите /bin/sh и повторите попытку.

Ivan

05.02.2020 12:52:19

И вот что я придумал.

sed 's/.*SHELL=//; s/[[:upper:]].*//' /proc/$$/environ
https://stackoverflow.com/questions/3327013/how-to-determine-the-current-shell-im-working-on/60073086#comment106252061_60073086
Это будет работать только на Linux ! Ни MacOS, ни BSD!!
Помочь в развитии проекта:
Закрыть X