8

Как узнать, в какой интерактивной оболочке я нахожусь (командная строка)

10

Как я могу определить, в какой оболочке я сейчас работаю?

Достаточно ли для этого вывода команды ps?

Как это можно сделать в различных версиях Unix?

5 ответ(ов)

0

Вы можете попробовать следующее:

ps | grep `echo $$` | awk '{ print $4 }'

Или:

echo $SHELL

Оба метода помогут вам узнать, какой шелл вы используете в данный момент. Первый вариант выводит информацию о текущем процессе, а второй просто выводит значение переменной окружения SHELL.

0

Существует несколько способов узнать, какая оболочка используется и какая у неё версия. Вот несколько, которые сработали для меня.

Простой способ

  1. $ echo $0 (Выводит имя программы. В моём случае результат был -bash.)
  2. $ $SHELL (Это запустит оболочку, и в приглашении вы получите имя и версию оболочки. В моём случае это было bash3.2$.)
  3. $ echo $SHELL (Это покажет путь к исполняемому файлу оболочки. В моём случае это было /bin/bash.)
  4. $ $SHELL --version (Это выдаст полную информацию о программном обеспечении оболочки, включая тип лицензии.)

Хакерский подход

$ ******** (Введите набор случайных символов, и в выводе вы получите имя оболочки. В моём случае это было -bash: chapter2-a-sample-isomorphic-app: command not found.)

0

У меня есть простой способ определить текущую оболочку. Просто введите случайную строку (которая не является командой). Это приведет к ошибке, и вы получите сообщение об ошибке "не найдено", при этом в начале строки будет указано, какая оболочка используется:

ksh: aaaaa: not found [No such file or directory]
bash: aaaaa: command not found

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

0

Вот мой вариант для получения информации о родительском процессе:

ps -p $$ | awk '$1 == PP {print $4}' PP=$$

Не запускайте лишние приложения, когда AWK может сделать это за вас.

0

Вы можете использовать следующий скрипт, который выводит полные пути, если ваша /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}'

Этот скрипт выполняет следующие шаги:

  1. Определяет PID текущего процесса.
  2. Установливает PATH для поиска утилит.
  3. Проверяет, доступна ли команда lsof.
  4. Находит родительский процесс текущего скрипта.
  5. Использует lsof для получения информации о открытых файлах этим процессом и фильтрует результаты для вывод полных путей.

Не забудьте предоставить необходимые права на выполнение скрипта и убедиться, что у вас есть доступ к командам, используемым в скрипте.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь