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