Два, которые я часто использую:
$ perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009
и
$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009
Несколько путей, от большинства до наименее надежного (и most-least "тяжелый"):
ps -p$$ -ocmd=
. (На Солярисе это, возможно, должно быть fname
вместо cmd
. На OSX и на BSD должен быть command
вместо cmd
.)$BASH_VERSION
, $ZSH_VERSION
, и другие определенные для оболочки переменные.$SHELL
; это - последнее средство, поскольку оно указывает Вашу оболочку по умолчанию и не обязательно текущую оболочку.Я нашел, что следующие работы в четырех оболочках установил в своей системе (удар, тире, zsh, csh):
$ ps -p $$
Следующие работы над zsh, ударом и тире, но не над csh:
$ echo $0
%self
может использоваться вместо $$
– Steven D
28.08.2016, 02:00
Примечание о некоторых более легких реализациях (телефоны на базе Android, busybox, и т.д.): ps
не всегда имеет поддержку -p
переключатель, но можно выполнить поиск с командой как ps | grep "^$$ "
. (Это grep
regex однозначно определит PID, таким образом, не будет никаких ложных положительных сторон.
ps | grep $$
может все еще дать ложные положительные стороны, если, например, Ваш текущий процесс 1234
и существует процесс 12345
.
– Keith Thompson
18.03.2014, 03:48
Как вопрос просит используемую оболочку и не говорит о потенциальных аргументах, переданных ей, вот путь, которые стараются не показывать им:
$ ps -o comm= -p $$
ksh93
Я установил $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.)
Пид работающей оболочки задается 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
.
Вы можете просто использовать команду echo $0
для проверки используемой оболочки и
для проверки версии оболочки. (например, bash --version
).
$0
также? – Mikel 18.03.2011, 04:41$0
потому что это более сложно: (1) это может быть просто базовое имя, (2) это может иметь '-' на передней стороне для обозначения его как оболочку входа в систему. – geekosaur 18.03.2011, 04:44ps -p$$ -ocmd=""
более симпатичный :-) – asoundmove 18.03.2011, 05:51$0
все еще кажется более полезным, чем$SHELL
: разве Вы не согласились бы? Вы могли всегда передавать его по каналу черезsed
удалить '-'. – iconoclast 30.08.2012, 00:49tcsh
,$tcsh
и$version
будет установлен. Это переменные оболочки, не переменные среды. Если Вы выполняете non-tcsh версиюcsh
, Я не думаю, что существуют любые отличительные переменные. И конечно синтаксис, используемый для проверки переменных, отличается между csh/tcsh, с одной стороны, и sh/ksh/bash/zsh на другом. чешущий – Keith Thompson 18.03.2014, 03:51