Як перевірити, яку оболонку я використовую в терміналі?


69

Як перевірити, яку оболонку я використовую в терміналі? Що таке оболонка, яку я використовую в MacOS?


2
@xenoterracide: принаймні unix.stackexchange.com/questions/3645/… . Відповідь гекозавра є більш повною, тому я проголосував за закриття попереднього питання.
Жиль

1
echo $ SHELL, ні?
невинний світ

@ невинний світ Ні, echo #SHELLце не зовсім так. Дивіться №3 у відповіді geekosaur .
Василь Бурк

Я не такий впевнений, що "оболонка" має чітко визначене значення. Наприклад, ви можете бігти, xterm -e /bin/cat але я не радий називати /bin/catоболонку.
Базиль Старинкевич

Також деякі оболонки (як scsh ) не використовують оболонку POSIX, як синтаксис.
Базиль Старинкевич

Відповіді:


71

Кілька способів, від більшості до найменш надійних (і від найменших до найменших «важких»):

  1. ps -p$$ -ocmd=. (Для Solaris це може знадобитися fnameзамість cmd. На OSX і на BSD має бути commandзамість cmd.)
  2. Перевірте $BASH_VERSION, $ZSH_VERSIONі інші змінні оболонки специфічні.
  3. Перевірка $SHELL; це в крайньому випадку, оскільки він визначає вашу стандартну оболонку, а не обов'язково поточну оболонку.

4
Чи варто $0також згадати ?
Мікель

Мені це не подобається, $0тому що це складніше: (1) це може бути лише базове ім'я, (2) може бути "-" на передній панелі, щоб позначити його як оболонку входу.
geekosaur

ps -p$$ -ocmd=""красивіше :-)
asoundmove

1
@geekosaur: можливо, так, але $0все ж здається кориснішим ніж $SHELL: ти не погодишся ? Ви завжди можете sedпередати його, щоб видалити "-".
іконоборство

2
Якщо ви працюєте tcsh, $tcshі $versionбуде встановлено. Це змінні оболонки, а не змінні середовища. Якщо ви використовуєте не-tcsh версію csh, я не думаю, що є відмінних змінних. І звичайно, синтаксис, який використовується для перевірки змінних, відрізняється між csh / tcsh з одного боку, і sh / ksh / bash / zsh з іншого.
Кіт Томпсон

41

Я виявив, що наступні роботи в чотирьох оболонках, які я встановив у своїй системі (bash, dash, zsh, csh):

$ ps -p $$

Наступні роботи щодо zsh, bash та dash, але не на csh:

$ echo $0

2
Також не працює на рибу.
Ron E

Я думаю, що відповідь @ jiliagre - це, мабуть, я би використовував сьогодні. На рибу %selfможна вживати замість$$
Стівен Д

8

Оскільки запитання запитує про використану оболонку і не розповідає про потенційні аргументи, передані їй, ось такий спосіб уникнути їх показу:

$ ps -o comm= -p $$
ksh93 

6

Примітка про більш легкі реалізації (телефони Android, зайнятий ящик тощо): psне завжди є підтримка -pкомутатора, але пошук можна виконати за допомогою такої команди ps | grep "^$$ ". (Цей grepрегулярний вираз однозначно ідентифікує PID, тому помилкових позитивних результатів не буде.


7
ps | grep $$Ви все одно можете дати помилкові позитиви, якщо, наприклад, ваш поточний процес є 1234і є процес 12345.
Кіт Томпсон

4

Є два дійсно простих способи:

  • Використання команди ps :

    ps -o comm= $$

    або

    ps -h -o comm -p $$

    де:

    • -hабо закінчити всі параметри, =щоб не було показано жодного заголовка.
    • -o commдля відображення лише базового імені процесу ( bashзамість /bin/bash).
    • -p <PID> список тільки обробляється з тим, що підтверджено список форм PID.
  • Використання псевдофайлової системи інформації / proc :

    cat /proc/$$/comm

    Цей параметр поводиться точно так, як psописана вище команда.

    або

    readlink /proc/$$/exe

    Це /proc/PID/exeпосилання на файл, який виконується, який у цьому випадку вказував би на / bin / bash, / bin / ksh тощо.

    Для отримання лише назви оболонки ви можете просто використовувати

    basename $(readlink /proc/$$/exe)

    Це єдиний варіант, який завжди дасть однаковий результат, навіть якщо ви знаходитесь у скрипті, джерелі коду чи терміналі, як посилання на бінарний інтерпретатор оболонки, який використовується.

    Попередження Ви повинні знати, що це покаже кінцевий бінарний, тому ksh може бути пов'язаний з ksh93 або sh з bash.

Використання /procдійсно корисно через те /proc/self, що посилається на PID поточної команди.


3

Сукупність усіх інших відповідей, сумісних з Mac (comm), Solaris (fname) та Linux (cmd):

ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1

це дає мені моє поточне ім'я каталогу; також, під cshі tcshце дає меніAmbiguous output redirect.
iconoclast

2

Якщо ви зберегли його у своїх змінних оточення, ви можете скористатись такими:

echo $SHELL

Це, швидше за все, поверне ім'я шляху оболонки, яка виконується для вашої оболонки для входу. Невідомо, що оболонка входу - це те, що ви зараз працюєте.
Kusalananda

1

Pid запущеної оболонки надається var $$ (у більшості оболонок).

whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`"
echo "$whichsh"

Використання зворотних посилань, щоб змусити працювати jsh (оболонка Heirlomm).

У багатьох оболонках прямий тест ps -o args= -p $$робіт, але busybox ashне вдається на цьому (вирішено).

Перевірка, яка $1повинна дорівнювати, $$видаляє більшість помилкових позитивних результатів.

Останні ;:використовуються для збереження оболонки для ksh та zsh.

Тести на інших системах допоможуть, будь ласка, прокоментуйте, якщо це не працює для вас.

Не працює за cshтипом снарядів.


В OS / X в тестах я отримую щонайменше 3 рядки, один для оболонки, один для /usr/lib/dyld, один для /private/var/db/dyld/dyld_shared_cache_x86_64.
Стефан Шазелас

Так, він вибирає лише записи в / bin та / usr / bin
Stéphane Chazelas

@ StéphaneChazelas Можливо, зараз краще?

0

Я встановив $MYSHELLдля майбутніх тестів у своїй оболонці ~/.aliases:

unset MYSHELL
if [ -n "$ZSH_VERSION" ] && type zstyle >/dev/null 2>&1; then        # zsh
  MYSHELL=`command -v zsh`
elif [ -x "$BASH" ] && shopt -q >/dev/null 2>&1; then                # bash
  MYSHELL=`command -v bash`
elif [ -x "$shell" ] && which setenv |grep builtin >/dev/null; then  # tcsh
  echo "DANGER: this script is likely not compatible with C shells!"
  sleep 5
  setenv MYSHELL "$shell"
fi

# verify
if [ ! -x "$MYSHELL" ]; then
  MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"`
  [ -x "$MYSHELL" ] || MYSHELL="${SHELL:-/bin/sh}"  # default if verify fails
fi

Цей tcshрозділ, ймовірно, нерозумно може скористатися сценарієм у стилі POSIX, оскільки він настільки кардинально відрізняється (таким чином, попередження та п’ятисекундна пауза). (Для одного, cshоболонки стилю не можуть зробити 2>/dev/nullабо >&2, як зазначалося в знаменитому програмі Csh, що вважається шкідливим .)


-1

Ви можете просто скористатися echo $0командою, щоб перевірити, яку оболонку ви використовуєте, і <name_of_the_shell> --versionперевірити версію оболонки. (напр. bash --version).


Стівен Д вже згадував про це
:)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.