Как узнать, в какой интерактивной оболочке я нахожусь (командная строка)
Как я могу определить, в какой оболочке я сейчас работаю?
Достаточно ли для этого вывода команды ps
?
Как это можно сделать в различных версиях Unix?
5 ответ(ов)
Вы можете попробовать следующее:
ps | grep `echo $$` | awk '{ print $4 }'
Или:
echo $SHELL
Оба метода помогут вам узнать, какой шелл вы используете в данный момент. Первый вариант выводит информацию о текущем процессе, а второй просто выводит значение переменной окружения SHELL
.
Существует несколько способов узнать, какая оболочка используется и какая у неё версия. Вот несколько, которые сработали для меня.
Простой способ
$ echo $0
(Выводит имя программы. В моём случае результат был -bash.)$ $SHELL
(Это запустит оболочку, и в приглашении вы получите имя и версию оболочки. В моём случае это было bash3.2$.)$ echo $SHELL
(Это покажет путь к исполняемому файлу оболочки. В моём случае это было /bin/bash.)$ $SHELL --version
(Это выдаст полную информацию о программном обеспечении оболочки, включая тип лицензии.)
Хакерский подход
$ ********
(Введите набор случайных символов, и в выводе вы получите имя оболочки. В моём случае это было -bash: chapter2-a-sample-isomorphic-app: command not found.)
У меня есть простой способ определить текущую оболочку. Просто введите случайную строку (которая не является командой). Это приведет к ошибке, и вы получите сообщение об ошибке "не найдено", при этом в начале строки будет указано, какая оболочка используется:
ksh: aaaaa: not found [No such file or directory]
bash: aaaaa: command not found
Таким образом, вы сможете быстро узнать, в какой оболочке работаете.
Вот мой вариант для получения информации о родительском процессе:
ps -p $$ | awk '$1 == PP {print $4}' PP=$$
Не запускайте лишние приложения, когда AWK может сделать это за вас.
Вы можете использовать следующий скрипт, который выводит полные пути, если ваша /bin/sh
поддерживает стандарт POSIX и у вас установлен командный утилита lsof
. Также в качестве альтернативы 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 # надежная проверка доступности системы POSIX?
PATH="`PATH=/usr/bin:/bin:/usr/sbin:/sbin getconf PATH`"
[ $? -ne 0 ] && { echo "'getconf PATH' не удался"; exit 1; }
export PATH
cmd="lsof"
env -i PATH="${PATH}" type "$cmd" 1>/dev/null 2>&1 || { echo "$cmd не найден"; 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 "родительский процесс не найден"; exit 1; }
lsofstr="`lsof -p $ppid`" ||
{ printf "%s\n" "lsof не удался" "попробуйте: sudo lsof -p \`ps -p \$\$ -o ppid=\`"; exit 1; }
printf "%s\n" "${lsofstr}" |
LC_ALL=C awk -v var="${awkstr}" '$NF ~ var {print $NF}'
Этот скрипт выполняет следующие шаги:
- Определяет PID текущего процесса.
- Установливает PATH для поиска утилит.
- Проверяет, доступна ли команда
lsof
. - Находит родительский процесс текущего скрипта.
- Использует
lsof
для получения информации о открытых файлах этим процессом и фильтрует результаты для вывод полных путей.
Не забудьте предоставить необходимые права на выполнение скрипта и убедиться, что у вас есть доступ к командам, используемым в скрипте.
Что означает "2>&1"?
Как установить переменную на вывод команды в Bash?
Разница между sh и Bash
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Прерывание скрипта оболочки при возвращении любой команды ненулевого значения