3.9. Shells
Anterior | Capítulo 3. Fundamentos do FreeBSD | Próxima

## 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ável | Descrição
--- | ---
`USER` | Nome do usuário atual.
`PATH` | Lista de diretórios separados por dois pontos para pesquisa de binários (progamas).
`DISPLAY` | Nome de rede do display do Xorg para conexão, se disponível.
`SHELL` | O shell atual.
`TERM` | O nome do tipo de terminal do usuário. Usado para determinar os recursos do terminal.
`TERMCAP` | Acesso à base de dados dos códigos de escape do terminal para executar várias funções do terminal.
`OSTYPE` | Tipo de sistema operacional.
`MACHTYPE` | A arquitetura da CPU do sistema.
`EDITOR` | O editor de texto preferencial do usuário.
`PAGER` | O utilitário preferencial do usuário para visualização de texto página à página.
`MANPATH` | Lista 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.

Anterior | Acima | Próxima
3.8. Processos e Daemons | Principal | 3.10. Editores de Texto

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>.