3.9. Shells

Um shell fornece uma interface de linha de comandos para interagir com o sistema operacional. Um shell recebe comandos do canal de entrada e os executa. Muitos shells fornecem funções incorporadas para ajudar nas tarefas diárias, como gerenciamento de arquivos, referenciamento de arquivos, edição de linha de comando, macros de comando e variáveis ​​de ambiente. O FreeBSD vem com vários shells, incluindo o shell Bourne (sh(1)) e o shell C estendido (tcsh(1)). Outros shells estão disponíveis na Coleção de Ports do FreeBSD, como o zsh e o bash.

O shell usado é realmente uma questão de gosto. Um programador C pode se sentir mais confortável com um shell semelhante ao C, como o tcsh(1). Um usuário Linux® pode preferir o bash. Cada shell tem propriedades únicas que podem ou não funcionar com o ambiente de trabalho preferido de um usuário, e é por isso que existe a opção de qual shell usar.

Um recurso de shell comum é a conclusão do nome do arquivo. Depois que um usuário digita as primeiras letras de um comando ou nome de arquivo e pressiona a tecla Tab, o shell completa o restante do comando ou nome do arquivo. Considere dois arquivos chamados foobar e football. Para excluir foobar, o usuário pode digitar rm foo e pressionar a tecla Tab para completar o nome do arquivo.

Mas se o shell mostrar apenas rm foo. Não foi possível completar o nome do arquivo porque ambos foobar e football começam com foo. Algumas shells emitem um sinal sonoro ou mostram todas as opções se houver mais de um nome. O usuário deve digitar mais caracteres para identificar o nome do arquivo desejado. Digitar um t e pressionar a tecla Tab novamente é suficiente para permitir que o shell determine qual nome de arquivo é desejado e preencha o resto.

Outra característica do shell é o uso de variáveis ​​de ambiente. As variáveis ​​de ambiente são um par de variável​​/chave armazenado no ambiente do shell. Esse ambiente pode ser lido por qualquer programa chamado pela shell e, portanto, contém muitas configurações de programas. Tabela 3.4, “Variáveis ​​de Ambiente Comuns” fornece uma lista de variáveis ​​de ambiente comuns e seus significados. Observe que os nomes das variáveis ​​de ambiente estão sempre em maiúsculas.

Tabela 3.4. Variáveis ​​de Ambiente Comuns
VariávelDescrição
USERNome do usuário atual.
PATHLista de diretórios separados por dois pontos para pesquisa de binários (progamas).
DISPLAYNome de rede do display do Xorg para conexão, se disponível.
SHELLO shell atual.
TERMO nome do tipo de terminal do usuário. Usado para determinar os recursos do terminal.
TERMCAPAcesso à base de dados dos códigos de escape do terminal para executar várias funções do terminal.
OSTYPETipo de sistema operacional.
MACHTYPEA arquitetura da CPU do sistema.
EDITORO editor de texto preferencial do usuário.
PAGERO utilitário preferencial do usuário para visualização de texto página à página.
MANPATHLista de diretórios separados por dois pontos para pesquisar páginas de manual.

O processo para definir uma variável de ambiente difere entre as shells. Em tcsh(1) e csh(1), use setenv para definir variáveis ​​de ambiente. Em sh(1) e no bash, use export para definir as variáveis ​​de ambiente atuais. Este exemplo define o EDITOR padrão para /usr/local/bin/emacs para a shell tcsh(1):

% setenv EDITOR /usr/local/bin/emacs

O comando equivalente para bash seria:

% export EDITOR="/usr/local/bin/emacs"

Para expandir uma variável de ambiente para ver sua configuração atual, digite um caracter $ na frente de seu nome na linha de comando. Por exemplo, echo $TERM exibe a configuração atual do $TERM.

Shells tratam caracteres especiais, conhecidos como meta-caracteres, como representações especiais de dados. O meta-caracter mais comum é *, que representa qualquer número de caracteres em um nome de arquivo. Meta-caracteres podem ser usados ​​para executar a globalização de nomes de arquivos. Por exemplo, echo * é equivalente a ls porque a shell pega todos os arquivos que correspondem ao * e echo os lista na linha de comando.

Para evitar que a shell interprete um caractere especial, escape-o a partir da shell, iniciando-o com uma barra invertida (\). Por exemplo, echo $TERM imprime a configuração do terminal, enquanto echo \$TERM imprime literalmente a string $TERM.

3.9.1. Alterando a Shell

A maneira mais fácil de alterar permanentemente a shell padrão é usar o chsh. A execução desse comando abrirá o editor que está configurado na variável de ambiente EDITOR, que por padrão é definido como o vi(1). Altere a linha Shell: para o caminho completo da nova shell.

Como alternativa, use chsh -s, que irá definir a shell especificada sem abrir um editor. Por exemplo, para alterar a shell para bash:

% chsh -s /usr/local/bin/bash

Nota:

A nova shell deve estar presente no arquivo /etc/shells. Se a shell foi instalada a partir da coleção de ports do FreeBSD, como descrito em Capítulo 4, Instalando Aplicativos: Pacotes e Ports, ela deve ser adicionada automaticamente a este arquivo. Se estiver faltando, adicione-a usando este comando, substituindo o caminho pelo caminho da shell:

# echo /usr/local/bin/bash >> /etc/shells

Em seguida, execute novamente o chsh(1).

3.9.2. Técnicas Avançadas de Shell

Escrito porTom Rhodes.

A shell UNIX® não é apenas um interpretador de comandos, ela atua como uma ferramenta poderosa que permite aos usuários executar comandos, redirecionar sua saída, redirecionar sua entrada e encadear comandos para melhorar o resultado final. Quando essa funcionalidade é mesclada com comandos incorporados, é fornecido ao usuário um ambiente que pode maximizar a eficiência.

O redirecionamento de shell é a ação de enviar a saída ou a entrada de um comando para outro comando ou para um arquivo. Para capturar a saída do comando ls(1), por exemplo, em um arquivo, redirecione a saída:

% ls > directory_listing.txt

O conteúdo do diretório agora será listado em directory_listing.txt. Alguns comandos podem ser usados ​​para ler entradas, como sort(1). Para classificar esta listagem, redirecione a entrada:

% sort < directory_listing.txt

A entrada será classificada e colocada na tela. Para redirecionar essa entrada para outro arquivo, pode-se redirecionar a saída de sort(1) misturando a direção:

% sort < directory_listing.txt > sorted.txt

Em todos os exemplos anteriores, os comandos estão executando o redirecionamento usando descritores de arquivos. Todo sistema UNIX® possui descritores de arquivos, que incluem entrada padrão (stdin), saída padrão (stdout) e erro padrão (stderr). Cada um tem um propósito, onde a entrada pode ser um teclado ou um mouse, algo que fornece entrada. A saída pode ser uma tela ou papel em uma impressora. E erro seria tudo o que pode ser usado para mensagens de diagnóstico ou erro. Todos os três são considerados descritores de arquivos baseados em I/O e, às vezes, considerados fluxos.

Através do uso desses descritores, a shell permite que a saída e a entrada sejam passadas por vários comandos e redirecionadas para/ou a partir de um arquivo. Outro método de redirecionamento é o operador de pipe.

O operador pipe UNIX®, | permite que a saída de um comando seja transmitida diretamente ou direcionada para outro programa. Basicamente, um pipe permite que a saída padrão de um comando seja passada como entrada padrão para outro comando, por exemplo:

% cat directory_listing.txt | sort | less

Nesse exemplo, o conteúdo de directory_listing.txt será classificado e a saída será transmitida para less(1). Isso permite que o usuário role pela saída em seu próprio ritmo e evite que ela role para fora da tela.

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.