Mostra cada shell de linha de comando instalado?

5

Como mostrar todos os shell de linha de comando instalados, (ou seja, bash , zsh , etc. ), sem duplicatas, e nada mais, (isto é, sem programas que não sejam shells)? Este código quase funciona no meu sistema Lubuntu , (que tem dash , ksh , zsh , csh e yash ), mas imprime whiptail e não consegue imprimir yash :

apropos shell | grep sh | \
  sed 's/ .*//;s/.*/which &/e;/^\/bin\//!d;s/.*/realpath &/e;/^\/bin\//!d' | \
  sort -u | xargs whatis
bash (1)             - GNU Bourne-Again SHell
bsd-csh (1)          - a shell (command interpreter) with C-like syntax
dash (1)             - command interpreter (shell)
ksh93 (1)            - KornShell, a command and programming language
lksh (1)             - Legacy Korn shell built on mksh
mksh (1)             - MirBSD Korn shell
whiptail (1)         - display dialog boxes from shell scripts
zsh5 (1)             - the Z shell
    
por agc 29.10.2016 / 17:33

2 respostas

13

No FreeBSD, no TrueOS / PC-BSD, no DragonFly BSD, etc.

A lista de shells aprovados , isto é, shells que o administrador permite que os usuários alterem seu login shell para o comando chsh , está na forma convencional /etc/shells Arquivo. Um simples

cat /etc/shells
fornece uma lista de shells aprovados.

No entanto, essa não é exatamente a lista de shells installed . Embora muitos shells de terceiros (o próprio sistema operacional vem com os shells Almquist e TENEX C) se instalem em /etc/shells quando instalados a partir de pacotes ou portas, isso não é garantido e é claro que o administrador pode ter alterado /etc/shells para que existe um shell que foi instalado mas que não é aprovado .

A lista de shells installed não é difícil de encontrar. Como mencionado anteriormente, as conchas Almquist e TENEX C vêm com o sistema operacional, como /bin/sh e /bin/tcsh (a.k.a. /bin/csh ), respectivamente. Para eles, um adiciona a lista de shells instalados a partir dos pacotes. No sistema de pacotes do FreeBSD, todos os shells estão na área shells/ da hierarquia de pacotes, portanto, basta usar a ferramenta pkg para consultar o banco de dados do pacote instalado:

pkg query "%o %n-%v %c" | awk '/^shells\// {$1="";print $0;}'

Isto irá pegar fish, rc, v7sh, heirloom-sh e similares se alguém os tiver instalado, mas também produzirá alguns falsos positivos para pacotes que estão na hierarquia shells/ , mas que não são per se , como conclusão do bash.

Leitura adicional

  • shells / . árvore de ports do FreeBSD . freebsd.org.
  • pkg-query . manual do FreeBSD . 2015. freebsd.org.

No OpenBSD

O OpenBSD é como o FreeBSD, TrueOS et al. com algumas diferenças. Ainda se corre

cat /etc/shells
para ver a lista de shells aprovados, e ainda existe a diferença entre shells aprovadas e instaladas.

O OpenBSD tem um gerenciador de pacotes mais antigo, e um conjunto diferente de shells que vêm no próprio sistema operacional.

No OpenBSD, o próprio sistema operacional vem com o shell Korn (pdksh, especificamente) e o shell C (não shell TENEX C) como /bin/sh (também conhecido como /bin/ksh ) e /bin/csh (não /bin/tcsh ) respectivamente.

Mais uma vez, os shells de terceiros adicionados a essa lista estão na área shells/ da hierarquia de pacotes, e o comando para encontrar os instalados é, portanto,

pkg_info -P -A | grep '^shells/'

Se você tiver o pacote sqlports instalado, também poderá usar sqlite3 para fazer consultas SQL no banco de dados /usr/local/share/sqlports para localizar pacotes de shell instalados.

Leitura adicional

  • shells / . árvore de ports do OpenBSD . ports.su.
  • pkg_info . manual do OpenBSD . 2016. openbsd.org.

No Debian, Ubuntu, e outros

Novamente, a lista de shells aprovados pode ser obtida com

cat /etc/shells
e novamente isso não é o mesmo que a lista de shells instalados.

No Debian e no Ubuntu, o shell every é gerenciado pelo gerenciador de pacotes. Não existem shells que "vêm com o sistema operacional".

Novamente, todos os pacotes de shell são marcados com facilidade. O APT (a Advanced Packaging Tool) tem a noção de "seções" em vez de uma hierarquia como os portais / pacotes BSD têm, e os pacotes shell estão na seção Shells .

Existem várias ferramentas que podem consultar o banco de dados do gerenciador de pacotes. Eu escolho aptitude aqui. Um corre

aptitude search '~i~sshells'
que procura por pacotes instalados ( ~i ) na seção ( ~s ) denominada shells .

Esta é a sintaxe de pesquisa "abreviada" de aptitude . A sintaxe de pesquisa "true" seria '?installed ?section(shells)' , o que é um pouco mais para digitar. Além disso: você pode obter aptitude para imprimir mais informações sobre cada pacote com sua opção de linha de comando -F . Considere

aptitude search -F '%p %v %t %d' '~i~sshells'
por exemplo.

Leitura adicional

por 29.10.2016 / 19:34
4

Você pode usar o arquivo /etc/shells . Ele deve conter uma lista de shells de login válidos.

    
por 29.10.2016 / 18:14