Linux узнать версию shell

How to test what shell I am using in a terminal?

I am not so sure that «shell» has a well defined meaning. For example, you might run xterm -e /bin/cat but I am not happy calling /bin/cat a shell.

13 Answers 13

Several ways, from most to least reliable (and most-to-least «heavy»):

  1. ps -p$$ -ocmd= . (On Solaris, this may need to be ps -p$$ -ofname= and on macOS and on BSD should be ps -p$$ -ocommand= .)
  2. Check for $BASH_VERSION , $ZSH_VERSION , and other shell-specific variables.
  3. Check $SHELL ; this is a last resort, as it specifies your default shell and not necessarily the current shell.

I don’t like $0 because it’s more complicated: (1) it may be just the basename, (2) it may have ‘-‘ on the front to designate it as a login shell.

@geekosaur: maybe so, but $0 still seems more useful than $SHELL : wouldn’t you agree? You could always pipe it through sed to remove the ‘-‘.

If you’re running tcsh , $tcsh and $version will be set. These are shell variables, not environment variables. If you’re running a non-tcsh version of csh , I don’t think there are any distinctive variables. And of course the syntax used to check variables differs between csh/tcsh on the one hand, and sh/ksh/bash/zsh on the other.

I’ve found that the following works in the four shells I have installed on my system (bash, dash, zsh, csh):

The following works on zsh, bash, and dash, but not on csh:

I think that @jiliagre’s answer is probably would I would use today. On fish %self can be used in place of $$

As the question asks for the shell used and does not talk about the potential arguments passed to it, here is a way that avoid showing them:

There are two really simple ways:

  • -h or finishing all options with = for not showing any header.
  • -o comm for showing only the process basename ( bash instead of /bin/bash ).
  • -p list only process whith PID form list suplied.

This /proc/PID/exe links to the file being executed, which in this case would point to /bin/bash, /bin/ksh, etc. For getting only the name of the shell you can just use

basename $(readlink /proc/$$/exe) 

The usage of /proc is really useful via the /proc/self , which links to the PID of the current command.

basename $(readlink /proc/$$/exe) is Korn/POSIX shell syntax. Won’t work in csh/tcsh/rc/es/akanga/fish. $$ won’t work in rc / es / akanga / fish .

basename $(readlink /proc/$$/exe) is the only command here that could work for me in a docker image with no ps installed.

A note about some lighter implementations (Android phones, busybox, etc.): ps doesn’t always have support for the -p switch, but you can accomplish the search with a command like ps | grep «^$$ » . (This grep regex will uniquely identify the PID, so there will not be any false positives.)

Читайте также:  Tcpdump linux примеры icmp

ps | grep $$ can still give false positives if, for example, your current process is 1234 and there’s a process 12345 .

A mix of all the other answers, compatible with Mac (comm), Solaris (fname) and Linux (cmd):

ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1 

this gives me my current directory name; also, under csh and tcsh it gives me Ambiguous output redirect.

This is also what Anaconda uses (version 2022.05) in it’s [env]/bin/activate script to detect shell type. A comment in that file explicitly links to this answer.

If you have it saved in your environment variables you can use the following:

For accuracy in many different shells you should use

What is that number?

It’s the process id of the current shell.

$ expands to the same value as the current shell.

$$ process ID of the parent in a sub shell

If you only want then name of the shell you could use

ps -p $$ | awk '1)print>' | awk '$0=$NF' | tr -d - 

In a nutshell we are taking the output of the process sub shell and piping it to some formatting tools awk, sed and tr all work for this, removing the first 3 columns, the first line of output, and then the — gives just the name of the shell. Consider putting that into a function for ease later.

That will most likely return the pathname of the shell executable of your login shell. It is not certain that the login shell is what you are currently running though.

I set $MYSHELL for future tests in my shell-agnostic ~/.aliases :

unset MYSHELL if [ -n "$ZSH_VERSION" ] && type zstyle >/dev/null 2>&1; then # zsh MYSHELL=`command -v zsh` elif [ -x "$BASH_VERSION" ] && type caller >/dev/null 2>&1; then # bash MYSHELL=`command -v bash` elif [ -x "$shell" ] && which setenv |grep -l 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="$" # default if verify fails fi 

The tcsh section is likely unwise to roll into a POSIX-style script since it’s so radically different (thus the warning and five second pause). (For one, csh -style shells can’t do 2>/dev/null or >&2 , as noted in the famous Csh Programming Considered Harmful rant.)

Источник

Как узнать свою версию Bash

Если у вас не работают примеры Bash кода, которые вы нашли онлайн или в учебниках, то одной из причин проблем может быть несоответствие версий. Или даже у вас может быть запущен не Bash, а одна из других многочисленных оболочек Linux.

Данная статья расскажет, как проверить используемую версию Bash и как убедиться, что вы работаете именно в Bash, а не в другой оболочке.

1.

Этот метод проверить версию Bash также позволит вам убедиться, что вы работаете именно в Bash:

Если вы используете другую оболочку, то ничего не будет выведено.

2.

Следующее сочетание клавиш покажет информацию о текущем экземпляре Bash, возможно вам будет проще его запомнить, чем имя переменной окружения:

Ctrl+x Ctrl+v

GNU bash, версия 5.0.17(1)-release (x86_64-pc-linux-gnu)

3.

Запуск bash с опцией —version:

Помните, что в этом случае версия bash будет выведена даже если в вашей текущей оболочке не используется bash, но bash установлен в системе.

4.

Если у вас система в обновлённом состоянии, то вы можете проверить версию Bash в репозиториях вашего дистрибутива — она будет соответствовать версии в вашей системе.

Для Debian, Linux Mint, Ubuntu, Kali Linux и их производных это можно сделать следующей командой:

В Arch Linux, BlackArch и их производных:

Источник

Как определить и изменить командную оболочку (shell) в Linux

Как изменить оболочку Shell в Linux

Командная оболочка или командный интерпретатор в Linux — это программа, которая в текстовой среде выступает в качестве интерфейса между пользователем и операционной системой. Она интерпретирует вводимые команды с терминала и вызывает необходимые программы.

Когда вы работаете в терминале, именно командная оболочка обрабатывает вводимые вами команды. Более того, оболочки Linux поддерживают написание программ на языке оболочки.

Оболочки Linux

Одна из самых популярных командных оболочек — это оболочка Bash (Bourne Again Shell). Она используется по умолчанию в большинстве дистрибутивов Linux.

Существуют разные оболочки Linux. Можно отметить:

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

Как определить текущую командую оболочку

Есть несколько способов определить оболочку, используемую по умолчанию в вашей системе Linux. Рассмотрим несколько из них, так как в разных системах (и оболочках) какие-то способы могут не сработать.

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

Способ 1

Переменная окружения SHELL хранит путь до исполняемого файла оболочки. Выполним команду:

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

Способ 2

Также можно воспользоваться командой echo $0 . Данная команда выведет на экран имя текущего работающего процесса, внутри которого она выполнена. Так как мы выполняем команду внутри оболочки, то будет выведено имя оболочки.

Способ 3

Определим, работающий процесс оболочки командой ps.

ps -p $$ PID TTY TIME CMD 10792 pts/3 00:00:00 bash

Определить текущую оболочку Shell в Linux

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

Список оболочек, которые в данный момент установлены и доступны в системе Linux, хранится в файле /etc/shells

Выведем содержимое файла /etc/shells , для этого выполняем команду:

cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/bash /bin/rbash /bin/dash

Список командных оболочек Linux

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

Чтобы временно переключиться на другую оболочку, достаточно выполнить в терминале команду, соответствующую ее имени. После этого вы переключитесь на новую оболочку.

Например, переключимся на оболочку sh. Выполняем команду:

Переключиться на другую оболочку в Linux

Как изменить оболочку

Для изменения командной оболочки на постоянной основе служит команда chsh (от слов change shell).

Чтобы изменить оболочку текущего пользователя нужно выполнить команду:

В качестве параметра путь_новой_оболочки необходимо указать путь до исполняемого файла оболочки, который вы можете найти в файле /etc/shells (см. выше).

Например, изменим оболочку на sh. Для этого выполняем команду (при выполнении команды нужно будет ввести пароль):

После этого нужно выйти и снова войти в систему.

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

Заключение

Мы рассмотрели, как определить текущую оболочку Linux, как просмотреть список доступных оболочек, а также как изменить оболочку, используемую по умолчанию.

Чтобы получить информацию о какой-либо оболочке (доступной в системе) можно воспользоваться Man-страницами. Например:

Дополнительные оболочки можно устанавливать средствами системы (из репозиториев). Например, для установки оболочки fish в Ubuntu Linux, выполните команду

Источник

Как узнать, какая оболочка используется в Linux

Существует несколько оболочек Linux, каждая из которых имеет свои особенности. Примеры популярных оболочек: Bash (является оболочкой по умолчанию на множестве дистрибутивов) и ZSH (по умолчанию является оболочкой на Kali Linux, имеет много поклонников).

Чтобы узнать, какая оболочка используется, выполните команду:

Посмотрите, что именно будет выведено:

  • /bin/bash — значит у вас Bash
  • /usr/bin/zsh — значит у вас ZSH

Как узнать, какая в действительности используется оболочка Linux

Но действительно ли всё так просто с оболочками?

Посмотрите на следующий скриншот и попробуйте угадать, какая оболочка будет обрабатывать последующие команды?

На скриншоте чётко видно, что команда вывела «/usr/bin/zsh», поэтому можно сказать, что используется оболочка ZSH.

Но это неправильный ответ.

Да, оболочкой по умолчанию в этой системе является ZSH, но чуть выше выполнена команда

и даже хотя оформление или приглашение командной строки не поменялось, теперь введённые команды обрабатывает Bash.

Это легко доказать, если выполнить команду

то Bash покажет краткую справку по своим командам. А ZSH выведет сообщение, что команда не найдена:

Что же на самом деле показывает переменная $SHELL? Видимо, это просто оболочка, используемая по умолчанию в данной системе, без учёта того, что пользователь мог запустить другую оболочку. Тем не менее вывод значение переменный $SHELL в большинстве случаев ответит на вопрос, какая оболочка используется на этой системе.

Чтобы убедиться, что используется Bash, можно выполнить команду:

Ещё один способ «узнать» Bash, это посмотреть на реакцию последовательного нажатия сочетания клавиш Ctrl+x Ctrl+v. В ответ на это Bash выведет примерно следующую строку:

GNU bash, версия 5.1.4(1)-release (x86_64-pc-linux-gnu)

Источник

How can I find my shell version using a Linux command?

I would like to know about my shell version using a Linux command. I tried the following command, but it shows the type of the shell I am in. Command:

Notice that you could use some strange shell, even one which is not POSIX compliant (e.g. fish or es. ). You should know what shell you are using. If it is bash , indeed try bash —version . Or use your package management system ( dpkg -l bash on Debian or Ubuntu)

4 Answers 4

It depends on whether you want to know the version of your default login shell, or the version of the shell you’re currently running. They’re not necessarily the same.

For your default login shell, as the accepted answer says, $SHELL —version is likely to work. Most (but not all) shells accept a —version option. ( dash does not.) And this assumes that the value of $SHELL hasn’t been changed (there can be valid reasons to do so).

For the shell you’re currently running, if it happens to be bash you can type:

echo $ZSH_VERSION echo $ZSH_PATCHLEVEL # shows more detailed information 

Again, this assumes that the relevant variable hasn’t been modified (there’s rarely any non-malicious reason to change it).

Bash in particular has an array variable $BASH_VERSINFO that gives more information in a form that’s easier to process programmatically. Printing $BASH_VERSINFO only prints the first element; to print all elements:

Источник

Оцените статью
Adblock
detector