Как протестировать то, что окружает, я использую в терминале?

Два, которые я часто использую:

$ perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009

и

$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009
69
18.03.2011, 04:09
9 ответов

Несколько путей, от большинства до наименее надежного (и most-least "тяжелый"):

  1. ps -p$$ -ocmd=. (На Солярисе это, возможно, должно быть fname вместо cmd. На OSX и на BSD должен быть command вместо cmd.)
  2. Проверьте на $BASH_VERSION, $ZSH_VERSION, и другие определенные для оболочки переменные.
  3. Проверить $SHELL; это - последнее средство, поскольку оно указывает Вашу оболочку по умолчанию и не обязательно текущую оболочку.
72
27.01.2020, 19:31
  • 1
    Если Вы упоминаете $0 также? –  Mikel 18.03.2011, 04:41
  • 2
    мне не нравится $0 потому что это более сложно: (1) это может быть просто базовое имя, (2) это может иметь '-' на передней стороне для обозначения его как оболочку входа в систему. –  geekosaur 18.03.2011, 04:44
  • 3
    ps -p$$ -ocmd="" более симпатичный :-) –  asoundmove 18.03.2011, 05:51
  • 4
    @geekosaur: возможно, так, но $0 все еще кажется более полезным, чем $SHELL: разве Вы не согласились бы? Вы могли всегда передавать его по каналу через sed удалить '-'. –  iconoclast 30.08.2012, 00:49
  • 5
    Если Вы работаете tcsh, $tcsh и $version будет установлен. Это переменные оболочки, не переменные среды. Если Вы выполняете non-tcsh версию csh, Я не думаю, что существуют любые отличительные переменные. И конечно синтаксис, используемый для проверки переменных, отличается между csh/tcsh, с одной стороны, и sh/ksh/bash/zsh на другом. чешущий –  Keith Thompson 18.03.2014, 03:51

Я нашел, что следующие работы в четырех оболочках установил в своей системе (удар, тире, zsh, csh):

$ ps -p $$

Следующие работы над zsh, ударом и тире, но не над csh:

$ echo $0
42
27.01.2020, 19:31
  • 1
    Также не работает над рыбой. –  Ron E 07.08.2016, 18:27
  • 2
    я думаю, что ответ @jiliagre, вероятно, был бы я использовать сегодня. На рыбе %self может использоваться вместо $$ –  Steven D 28.08.2016, 02:00

Примечание о некоторых более легких реализациях (телефоны на базе Android, busybox, и т.д.): ps не всегда имеет поддержку -p переключатель, но можно выполнить поиск с командой как ps | grep "^$$ ". (Это grep regex однозначно определит PID, таким образом, не будет никаких ложных положительных сторон.

6
27.01.2020, 19:31
  • 1
    ps | grep $$ может все еще дать ложные положительные стороны, если, например, Ваш текущий процесс 1234 и существует процесс 12345. –  Keith Thompson 18.03.2014, 03:48

Это работает также:

env | grep SHELL
-5
27.01.2020, 19:31

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

$ ps -o comm= -p $$
ksh93 
8
27.01.2020, 19:31
[112419] Смесь всех остальных ответов, совместимых с Mac (Comm), Solaris (имя) и Linux (cmd):[12165]
3
27.01.2020, 19:31

Я установил $MYSHELL для будущих тестов в моей shell-диагностике ~/.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-программировании, считающемся вредным rant.)

.
0
27.01.2020, 19:31

Пид работающей оболочки задается var $$ (в большинстве оболочек).

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

Использование обратных ссылок, чтобы заставить jsh (Heirlomm shell) работать.

Во многих оболочках работает прямой тест ps -o args= -p $$, но busybox ash на этом (решен) не работает.

Проверка, что $1 должен быть равен $$, удаляет большинство ложных срабатываний.

Последние ;: используются для поддержания работы оболочки для ksh и zsh.

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

Не работает в оболочках типа csh.

1
27.01.2020, 19:31

Вы можете просто использовать команду echo $0 для проверки используемой оболочки и --version для проверки версии оболочки. (например, bash --version).

-1
27.01.2020, 19:31

Теги

Похожие вопросы