Як перевірити, яку оболонку я використовую в терміналі? Що таке оболонка, яку я використовую в MacOS?
echo #SHELLце не зовсім так. Дивіться №3 у відповіді geekosaur .
xterm -e /bin/cat але я не радий називати /bin/catоболонку.
Як перевірити, яку оболонку я використовую в терміналі? Що таке оболонка, яку я використовую в MacOS?
echo #SHELLце не зовсім так. Дивіться №3 у відповіді geekosaur .
xterm -e /bin/cat але я не радий називати /bin/catоболонку.
Відповіді:
Кілька способів, від більшості до найменш надійних (і від найменших до найменших «важких»):
ps -p$$ -ocmd=. (Для Solaris це може знадобитися fnameзамість cmd. На OSX і на BSD має бути commandзамість cmd.)$BASH_VERSION, $ZSH_VERSIONі інші змінні оболонки специфічні.$SHELL; це в крайньому випадку, оскільки він визначає вашу стандартну оболонку, а не обов'язково поточну оболонку.$0також згадати ?
$0тому що це складніше: (1) це може бути лише базове ім'я, (2) може бути "-" на передній панелі, щоб позначити його як оболонку входу.
ps -p$$ -ocmd=""красивіше :-)
$0все ж здається кориснішим ніж $SHELL: ти не погодишся ? Ви завжди можете sedпередати його, щоб видалити "-".
tcsh, $tcshі $versionбуде встановлено. Це змінні оболонки, а не змінні середовища. Якщо ви використовуєте не-tcsh версію csh, я не думаю, що є відмінних змінних. І звичайно, синтаксис, який використовується для перевірки змінних, відрізняється між csh / tcsh з одного боку, і sh / ksh / bash / zsh з іншого.
Я виявив, що наступні роботи в чотирьох оболонках, які я встановив у своїй системі (bash, dash, zsh, csh):
$ ps -p $$
Наступні роботи щодо zsh, bash та dash, але не на csh:
$ echo $0
%selfможна вживати замість$$
Примітка про більш легкі реалізації (телефони Android, зайнятий ящик тощо): psне завжди є підтримка -pкомутатора, але пошук можна виконати за допомогою такої команди ps | grep "^$$ ". (Цей grepрегулярний вираз однозначно ідентифікує PID, тому помилкових позитивних результатів не буде.
ps | grep $$Ви все одно можете дати помилкові позитиви, якщо, наприклад, ваш поточний процес є 1234і є процес 12345.
Є два дійсно простих способи:
Використання команди 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 поточної команди.
Сукупність усіх інших відповідей, сумісних з 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.
Якщо ви зберегли його у своїх змінних оточення, ви можете скористатись такими:
echo $SHELL
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типом снарядів.
/usr/lib/dyld, один для /private/var/db/dyld/dyld_shared_cache_x86_64.
Я встановив $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, що вважається шкідливим .)