Capítulo 1. Manuais de GNU/Linux

# Capítulo 1. Manuais de GNU/Linux

Acho que aprender um sistema de computador é como aprender uma nova língua estrangeira. Apesar dos livros e documentação darem ajuda, tem que praticar também. De modo a ajudá-lo a iniciar suavemente, elaborei alguns pontos básicos.

O design poderoso da Debian GNU/Linux vem do sistema operativo Unix, isto é, um sistema operativo multi-utilizador e multi-tarefa. Necessita aprender a tirar vantagem do poder destas funcionalidades e semelhanças entre Unix e GNU/Linux.

Não se esconda dos textos orientados ao Unix e não se guie somente nos textos de GNU/Linux, por isto rouba-lhe muita informação útil.

| Nota
Se tem usado qualquer sistema de tipo Unix com ferramentas de linha de comandos, provavelmente já sabe tudo o que explico aqui. Por favor use isto como um teste de realidade e refrescamento.

## 1.1. Básico da consola

### 1.1.1. A linha de comandos da shell

Ao iniciar o sistema, é-lhe apresentado o ecrã de autenticação baseado em caracteres se não instalou nenhum ambiente GUI como o GNOME ou o sistema de desktop KDE. Suponha que o seu nome de anfitrião é `foo`, a prompt de login tem o seguinte aspeto.

Se instalou um ambiente GUI, então pode ir à mesma para uma prompt de login baseada em caracteres ao pressionar Ctrl-Alt-F3 e pode regressar ao ambiente GUI via Ctrl-Alt-F2 (para mais informação veja Secção 1.1.6, “Consolas virtuais” em baixo).

    foo login:

Na prompt de login, escreva o seu nome de utilizador, p.e. `penguin` e carregue na tecla Enter, depois escreva a sua palavra-passe e carregue novamente na tecla Enter.

| Nota
A seguir a tradição do Unix, o nome de utilizador e palavra-passe do sistema Debian são sensíveis a maiúsculas/minúsculas. O nome de utilizador é geralmente escolhido apenas em minúsculas. A primeira conta de utilizador é normalmente criada durante a instalação. Podem ser criadas contas de utilizador adicionais com `adduser`(8) pelo root.

O sistema inicia com a mensagem de boas vindas armazenada em "`/etc/motd`" (Mensagem do Dia) e apresenta uma prompt de comandos.

    Debian GNU/Linux 12 foo tty3

    foo login: penguin
    Password:

    Linux foo 6.5.0-0.deb12.4-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.5.10-1~bpo12+1 (2023-11-23) x86_64

    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.

    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.

    Last login: Wed Dec 20 09:39:00 JST 2023 on tty3
    foo:~$

Está agora na shell. A shell interpreta os seus comandos.

### 1.1.2. A linha de comandos na GUI

Se instalou um ambiente GUI durante a instalação, é-lhe apresentado o ecrã gráfico de início de sessão ao iniciar o sistema. Introduza o seu nome de utilizador e a sua palavra-passe para iniciar sessão na conta de utilizador não privilegiado. Utilize o separador para navegar entre o nome de utilizador e a palavra-passe, ou utilize o clique primário do rato.

Pode obter a linha de comandos da shell num ambiente GUI iniciando um programa `x-terminal-emulator` como o `gnome-terminal`(1), `rxvt`(1) ou `xterm`(1). No ambiente de trabalho GNOME, premir a tecla SUPER (tecla Windows) e escrever "terminal" na linha de pesquisa faz o truque.

Em alguns Ambientes de Trabalho (como o `fluxbox`), pode não existir um ponto de partida óbvio para o menu. Se isto acontecer, tente clicar (botão direito) no fundo do ambiente de trabalho e espere que apareça um menu.

### 1.1.3. A conta root

A conta root também é chamada como de super utilizador ou de utilizador privilegiado. A partir desta conta, pode executar as seguintes tarefas de administração do sistema:

- Ler, escrever e remover quaisquer ficheiros no sistema independentemente das permissões deles

- Definir o dono e permissões de quaisquer ficheiros no sistema

- Definir a palavra-passe de quaisquer utilizadores não privilegiados do sistema

- Iniciar sessão (Login) em qualquer conta sem a palavra-passe deles

Este poder ilimitado da conta root requer que você seja atento e responsável quando a utilizar.

| Atenção
Nunca partilhe a palavra-passe de root com outros.

| Nota

As permissões de um ficheiro (incluindo aparelhos de hardware como CD-ROM etc. os quais são apenas outros ficheiros para o sistema Debian) podem torná-lo não-utilizável ou inacessível para utilizadores não-root. Apesar da utilização da conta root ser um modo rápido de testar este tipo de situação, a resolução dela deve ser feita através da definição correcta das permissões do ficheiro e membros dos grupos de utilizadores. (veja Secção 1.2.3, “Permissões do sistema de ficheiros”).

### 1.1.4. A linha de comandos shell do root

Aqui estão alguns métodos básicos de obter o prompt da shell de root ao utilizar a palavra-passe do root:

- Escreva `root` na prompt de login baseada em caracteres.

- Escreva "`su -l`" na prompt da shell de qualquer utilizador.

  - Isto não preserva o ambiente do utilizador atual.

- Escreva "`su`" na prompt de shell de qualquer utilizador.

  - Isto preserva algum do ambiente do utilizador atual.

### 1.1.5. GUI de ferramentas de administração do sistema

Quando o menu do ambiente de trabalho não inicia automaticamente as ferramentas de administração do sistema GUI com o privilégio apropriado, pode iniciá-las a partir da prompt da shell de raiz do emulador de terminal, como o `gnome-terminal`(1), `rxvt`(1) ou `xterm`(1). Ver Secção 1.1.4, “A linha de comandos shell do root” e Secção 7.9, “Ligação ao servidor X”.

| Atenção
Nunca inicie o gestor de ecrã/sessão GUI com a conta root ao escrever `root` na prompt do gestor de ecrã/sessão como o `gdm3`(1). Nunca execute programas GUI remotos que não sejam confiáveis no X Window quando é mostrada informação critica porque pode "espiar" o seu ecrã X.

### 1.1.6. Consolas virtuais

Por omissão no sistema Debian existem disponíveis seis consolas de caracteres alternáveis tipo VT100 para arrancar a shell de comandos directamente na máquina Linux. A menos queesteja num ambiente GUI, pode mudar entre consolas virtuais ao pressionar `Left-Alt-key` e simultaneamente numa das teclas `F1` — `F6`. Cada consola de caracteres permite um login independente à conta e oferece um ambiente multi-utilizador. Este ambiente multi-utilizador é uma funcionalidade excelente do Unix e muito viciante.

Se está no ambiente GUI, pode ganhar acesso à consola 3 ao pressionar as teclas `Ctrl-Alt-F3`, isto é, a tecla esquerda `Ctrl`, a tecla esquerda`Alt` e a tecla `F1` pressionadas em conjunto. Pode regressar ao ambiente GUI, que normalmente executa na consola virtual 7, ao pressionar `Alt-F7`.

Pode, em alternativa, mudar para outra consola virtual, por exemplo à consola 3, a partir da linha de comandos.

    # chvt 3

### 1.1.7. Como abandonar a linha de comandos

Escreva `Ctrl-D`, isto é, a `tecla-Ctrl-esquerda` e a `tecla d` pressionadas ao mesmo tempo, na linha de comandos para fechar a atividade da shell. Se estiver na consola de caracteres, com isto, retorna ao aviso de login. Mesmo que estes caracteres de controle sejam referidos como "control D" com letra maiúscula, não precisa de pressionar a tecla Shift. A expressão curta, `^D`, também é usada para `Ctrl-D`. Em alternativa pode escrever "exit".

Se estiver no `x-terminal-emulator`(1), com isto pode fechar a janela do `x-terminal-emulator`.

### 1.1.8. Como desligar o sistema

Tal como qualquer outro SO moderno onde operar ficheiros involve pôr dados em cache em memória para melhorar a performance, o sistema Debian precisa de um processo apropriado de desligar antes que a energia possa ser, em segurança, desligada. Isto é para manter a integridade dos ficheiros, ao forçar todas as alterações em memória a serem escritas no disco. Se estiver disponível software de controle de energia, o processo de desligar desliga automaticamente a energia do sistema. (Caso contrário, pode ter de pressionar o botão de energia por alguns segundos após o procedimento de desligar.)

Pode desligar o sistema sob o modo normal de multi-utilizador a partir da linha de comandos.

    # shutdown -h now

Pode desligar o sistema sob o modo único-utilizador a partir da linha de comandos.

    # poweroff -i -f

Veja a Secção 6.3.8, “Como desligar o sistema remoto em SSH”.

### 1.1.9. Recuperar uma consola sã

Quando o ecrã fica estranho após fazer coisas estranhas tal como "`cat qualquer-ficheiro-binário`", escreva "`reset`" na linha de comandos. Poderá não ver o comando a aparecer quando o escreve. Também pode utilizar "`clear`" para limpar o ecrã.

### 1.1.10. Sugestões de pacotes adicionais para o novato

Apesar de mesmo uma instalação mínima do sistema Debian sem quaisquer tarefas de ambiente de trabalho disponibilizar as funcionalidades básicas do Unix, é uma boa ideia instalar alguns pacotes baseados em linha de comandos e terminais de caracteres baseados em curses tais como o `mc` e o `vim` com o `apt-get`(8) para os iniciantes começarem, pelo seguinte.

    # apt-get update
     ...
    # apt-get install mc vim sudo aptitude
     ...

Se já tiver estes pacotes instalados, não serão instalados novos pacotes.

Tabela 1.1. Lista de pacotes de programas interessantes em modo de texto

pacote | popcon | tamanho | descrição
--- | --- | --- | ---
`mc` | V:43, I:183 | 1590 | Um gestor de ficheiro de ecrã completo em modo de texto
`sudo` | V:732, I:863 | 6773 | Um programa para permitir privilégios de root limitados aos utilizadores
`vim` | V:86, I:346 | 4089 | O editor de texto de Unix Vi IMproved, um editor de texto para programadores (versão standard)
`vim-tiny` | V:57, I:978 | 1877 | O editor de texto de Unix Vi IMproved, um editor de texto para programadores (versão compacta)
`emacs-nox` | V:3, I:13 | 46536 | Emacs do Projecto GNU, o editor de texto extensível baseado em Lisp
`w3m` | V:11, I:145 | 2853 | Navegadores de WWW de modo de texto
`gpm` | V:9, I:9 | 526 | O cortar-e-colar estilo Unix na consola de texto (daemon)

Pode ser uma boa ideia ler algumas documentações informativas.

Tabela 1.2. Lista de pacotes de documentação informativa

pacote | popcon | tamanho | descrição
--- | --- | --- | ---
`doc-debian` | I:882 | 187 | Documentação do Projecto Debian, (FAQ do Debian) e outros documentos
`debian-policy` | I:8 | 5061 | Manual de Políticas Debian e documentos relacionados
`developers-reference` | V:0, I:2 | 2601 | Guias e informação para programadores de Debian
`debmake-doc` | I:0 | 11807 | Guia para Mantedor Debian
`debian-history` | I:0 | 6251 | História do Projecto Debian
`debian-faq` | I:880 | 791 | FAQ do Debian

Pode instalar alguns destes pacotes com o seguinte.

    # apt-get install package_name

### 1.1.11. Uma conta de utilizador extra

Se não deseja usar a sua conta de utilizador principal para as seguintes atividades de treino, pode criar uma conta de utilizador para treinos, por exemplo, `fish`, a fazer o seguinte:

    # adduser fish

Responder a todas as questões.

Isto cria uma conta chamada `fish`. Após praticar, pode remover esta conta de utilizador e o diretório home dele a fazer o seguinte:

    # deluser --remove-home fish

Em sistemas não-Debian e Debian especializados, as actividades acima precisam de utilizar utilitários de baixo nível `useradd`(8) e `userdel`(8).

### 1.1.12. Configuração do sudo

Para a típica estação de trabalho de um único utilizador como o ambiente de trabalho do sistema Debian no PC portátil, é comum implementar uma configuração simples do `sudo`(8) como a seguir para permitir ao utilizador não-privilegiado, ex. `penguin`, ganhar privilégios administrativos apenas com a sua palavra-passe de utilizador mas sem a palavra-passe do root.

    # echo "penguin  ALL=(ALL) ALL" >> /etc/sudoers

Em alternativa, é também comum fazer como a seguir para permitir a um utilizador não privilegiado, ex. `penguin`, ganhar privilégios administrativos sem qualquer palavra-passe.

    # echo "penguin  ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

Este truque só deve ser usado na estação de trabalho de um único utilizador que administra e onde é o único utilizador.

| Atenção
Não configure assim as contas de utilizadores normais numa estação de trabalho multi-utilizador porque seria muito mau para a segurança do sistema.

| Cuidado

A palavra-passe e a conta `penguin` no exemplo em cima requer tanta protecção como a palavra-passe do root e a conta do root.

O privilégio administrativo neste contexto pertence a alguém autorizado a executar as tarefas de administração do sistema numa estação de trabalho. Nunca dê tais privilégios a um gestor do departamento Administrativo da sua firma ou ao seu chefe a menos que eles sejam autorizados e capazes.

| Nota

Para disponibilizar privilégios de acesso a aparelhos limitados e ficheiros limitados, deve considerar usar o group para disponibilizar acesso limitado em vez de usar os privilégios do `root` via `sudo`(8).

Com uma configuração melhor pensada e cuidada, o `sudo`(8) pode garantir privilégios administrativos limitados a outros utilizadores num sistema partilhado sem partilhar a palavra-passe do root. Isto pode ajudar com as responsabilidades com máquinas com múltiplos administradores para que possa saber quem fez o quê. Por outro lado, pode querer que mais ninguém tenha tais privilégios.

### 1.1.13. Hora de brincar

Agora está pronto para brincar com o sistema Debian sem riscos desde que use a conta de utilizador sem-privilégios.

Isto porque o sistema Debian é, mesmo após uma instalação predefinida, configurado com permissões de ficheiros apropriadas que previne os utilizadores não privilegiados de danificarem o sistema. É claro, podem ainda existir alguns buracos que possam ser explorados mas aqueles que se preocupam com estes problemas não deveriam ler esta secção e deveriam ler o Manual de Segurança Debian.

Aprendemos o sistema Debian como um sistema tipo Unix com o seguinte:

- Secção 1.2, “Sistema de ficheiros tipo Unix” (conceitos básicos)

- Secção 1.3, “Midnight Commander (MC)” (método de sobrevivência)

- Secção 1.4, “O ambiente de trabalho estilo Unix básico” (método básico)

- Secção 1.5, “O comando simples da shell” (mecanismo da shell)

- Secção 1.6, “Processamento de texto estilo Unix” (método de processamento de texto)

## 1.2. Sistema de ficheiros tipo Unix

No GNU/Linux e noutros sistemas operativos tipo Unix, os ficheiros estão organizados em diretórios. Todos os ficheiros e diretórios estão organizados numa grande árvore que nasce em "`/`". É chamada uma árvore porque se desenhar o sistema de ficheiros, parece-se com uma árvore mas está de cabeça para baixo.

Estes ficheiros e diretórios podem estar espalhados por vários aparelhos. `mount`(8) serve para anexar o sistema de ficheiros encontrado num aparelho à grande árvore de ficheiros. Reciprocamente, `umount`(8) desanexa-os novamente. Nos kernel Linux recentes, o `mount`(8) com algumas opções pode unir parte de uma árvore de ficheiros noutro lugar ou pode montar um sistema de ficheiros como partilhado, privado, escravo ou não-unível. As opções do mount suportadas para cada sistema de ficheiros estão disponíveis em "`/usr/share/doc/linux-doc-*/Documentation/filesystems/`".

Os diretórios no sistema Unix são chamados pastas nalguns outros sistemas. Por favor note também que não existe conceito para drive tal como "`A:`" em qualquer sistema Unix. Existe um sistema de ficheiros e tudo está incluído nele. Esta é uma enorme vantagem em comparação com o Windows.

### 1.2.1. Noções básicas de ficheiros Unix

Aqui estão algumas noções básicas de ficheiros Unix:

- Os nomes de ficheiro são sensíveis a maiúsculas/minúsculas. Isto é, "`MEUFICHEIRO`" e "`MeuFicheiro`" são ficheiros diferentes.

- O diretório raiz significa a raiz do sistema de ficheiros e é referido simplesmente como "`/`". Não confundir isto com o diretório pessoal do utilizador root: "`/root`".

- Todos os diretórios têm um nome que pode conter quaisquer letras ou símbolos excepto "`/`". O diretório raiz é uma excepção. O nome dele é "`/`" (pronuncia-se "slash" ou "o diretório raiz") e não pode ser renomeado.

- Cada ficheiro ou diretório é designado por um nome de ficheiro totalmente qualificado, nome de ficheiro absoluto, ou caminho, que fornece a sequência de diretórios que têm de ser percorridos para o alcançar. Estes três termos são sinónimos.

- Todos os nomes de ficheiro totalmente qualificados começam com o diretório "`/`" e existe um "`/`" entre cada diretório ou ficheiro no nome do ficheiro. O primeiro "`/`" é o diretório de nível de topo e os outros "`/`"' separam sucessivamente os sub-diretórios, até que se chegue à última entrada que é o nome real do ficheiro. As palavras utilizadas aqui conseguem ser confusas. Veja o seguinte nome de ficheiro completamente qualificado como um exemplo: "`/usr/share/keytables/us.map.gz`". No entanto, as pessoas também se referem ao seu nome base sozinho "`us.map.gz`" como um nome de ficheiro.

- O diretório raiz tem algumas ramificações, tais como "`/etc/`" e "`/usr/`". Estes sub-diretórios por sua vez ramificam-se em mais sub-diretórios, tais como "`/etc/systemd/`" e "`/usr/local/`". O todo, visto em conjunto, é a chamada árvore de diretórios. Pode pensar num nome de ficheiro absoluto como um caminho desde a base da árvore ("`/`") até ao fim de um ramo (um ficheiro). Também pode ouvir pessoas falar da árvore de diretórios como se fosse uma árvore de família a juntar todos os descendentes diretos numa única figura chamada de diretório raiz ("`/`"): assim, os sub-diretórios têm pais e um caminho mostra a linhagem completa de um ficheiro. Existem também caminhos relativos que começam algures noutro ponto que não o diretório raiz. Deve lembrar-se que o diretório "`../`" refere-se ao diretório pai. Esta terminologia também se aplica a outras estruturas semelhantes a diretórios, como estruturas hierárquicas de dados.

- Não existe componente especial no nome de caminho que corresponde a um aparelhos físico, tal como o seu disco rígido. Isto difere de RT-11, CP/M, OpenVMS, MS-DOS, AmigaOS e Microsoft Windows, onde o caminho contém um nome de aparelho tal como "`C:\`". (No entanto, existem entradas nos diretórios que referem-se a aparelhos físicos como parte do sistema de ficheiros normal. Veja Secção 1.2.2, “Internos do sistema de ficheiros”.)

| Nota

Apesar de poder usar quase todas as letras ou símbolos num nome de ficheiro, na prática é má ideia fazê-lo. É melhor evitar quaisquer caracteres que geralmente têm significados especiais na linha de comandos, incluindo espaços, tabs, novas linhas e outros caracteres especiais: `{ } ( ) [ ] ' ` " \ / > < | ; ! # & ^ * % @ $` . Se deseja separar palavras num nome, as boas escolhas são o ponto, traço e underscore. Também pode capitalizar cada palavra assim "`ComoEsteExemplo`". Os utilizadores avançados de Linux procuram evitar espaços nos nomes de ficheiros.

| Nota
A palavra "root" pode significar o "utilizador root" ou o "diretório raiz (root)". O contexto da utilização deles deve torná-lo claro.

| Nota
A palavra caminho (path) é usada não apenas para o nome-de-ficheiro totalmente qualificado como em cima mas também para o caminho de busca de comandos. O significado pretendido é geralmente claro a partir do contexto.

As melhores práticas detalhadas para a hierarquia de ficheiros estão descritas no Filesystem Hierarchy Standard ("`/usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz`" e `hier`(7)). Deve lembrar-se dos seguintes factos como princípio.

Tabela 1.3. Lista de utilização de diretórios chave

diretório | utilização do diretório
--- | ---
`/` | o diretório raiz
`/etc/` | ficheiros de configuração de todo o sistema
`/var/log/` | ficheiros log do sistema
`/home/` | todos os diretórios home de todos os utilizadores não privilegiados

### 1.2.2. Internos do sistema de ficheiros

A seguir a tradição do Unix, o sistema Debian GNU/Linux disponibiliza o sistema de ficheiros sob o qual residem os dados físicos em discos rígidos e outros aparelhos de armazenamento e a interacção com os aparelhos de hardware como ecrãs de consola e consolas série remotas são representados num modo unificado sob "`/dev/`".

Cada ficheiro, diretório, 'named pipe' (um modo de dois programas partilharem dados), ou aparelho físico num sistema Debian GNU/Linux tem uma estrutura de dados chamada inode que descreve os seus atributos associados como o utilizador que o possui (o dono), o grupo a que pertence, a hora do último acesso, etc. A ideia de representar praticamente tudo no sistema de ficheiros foi uma inovação do Unix e os modernos kernel Linux desenvolveram esta ideia ainda mais. Atualmente, até informação sobre os processos que correm no computador encontra-se no sistema de ficheiros.

Esta representação abstracta e unificada de entidades físicas e processos internos é muito poderosa porque permite-nos utilizar o mesmo comando para o mesmo tipo de operação em muitos aparelhos totalmente diferentes. É mesmo possível alterar o modo como o kernel funciona ao escrever dados em ficheiros especiais que estão ligados a processos em execução.

| Dica
Se necessitar identificar a correspondência entre a árvore de ficheiros e a entrada física, execute `mount`(8) sem argumentos.

### 1.2.3. Permissões do sistema de ficheiros

As Permissões de sistemas de ficheiros de sistemas tipo-Unix são definidas por três categorias de utilizadores afetados:

- O utilizador que é dono do ficheiro (u)

- Outros utilizadores no grupo ao qual o ficheiro pertence (g)

- Todos os outros utilizadores (o) também referido como "mundo" e "todos"

Para o ficheiro, cada permissão correspondente permite as seguintes ações:

- A permissão read (r) permite ao dono examinar o conteúdo do ficheiro.

- A permissão write (w) permite ao dono modificar o ficheiro.

- A permissão execute (x) permite ao dono correr o ficheiro como um comando.

Para o diretório, cada permissão correspondente permite as seguintes ações:

- A permissão read (r) permite ao dono listar o conteúdo do diretório.

- A permissão write (w) permite ao dono adicionar ou remover ficheiros no diretório.

- A permissão execute (x) permite ao dono aceder aos ficheiro no diretório.

Aqui, a permissão execute num diretório significa não só permitir a leitura dos ficheiros nesse diretório mas também permitir visualizar os seus atributos, tais como o tamanho e a hora de modificação.

`ls`(1) é utilizado para mostrar informação de permissões (e mais) para ficheiros e diretórios. Quando é invocado com a opção "`-l`", mostra a seguinte informação na ordem apresentada.

- Tipo de ficheiro (primeiro caractere)

- Permissão de acesso do ficheiro (nove caracteres, a consistir em três caracteres cada para utilizador, grupo e outros por esta ordem)

- Quantidade de ligações rígidas ao ficheiro

- Nome do utilizador dono do ficheiro

- Nome do grupo ao qual o ficheiro pertence

- Tamanho do ficheiro em caracteres (bytes)

- Data e hora do ficheiro (mtime)

- Nome do ficheiro

Tabela 1.4. Lista do primeiro caractere da saída de "`ls -l`"

caractere | significado
--- | ---
`-` | ficheiro normal
`d` | diretório
`l` | ligação simbólica
`c` | nó de aparelho de caractere
`b` | nó de aparelho de bloco
`p` | named pipe
`s` | socket

`chown`(1) é utilizado a partir da conta de root para alterar o dono do ficheiro. `chgrp`(1) é utilizado a partir da conta do dono do ficheiro ou da conta root para alterar o grupo do ficheiro. `chmod`(1) é usado a partir da conta do dono do ficheiro ou da conta root para alterar as permissões de acesso ao ficheiro ou diretório. A sintaxe básica para manipular o ficheiro `foo` é a seguinte.

    # chown newowner foo
    # chgrp newgroup foo
    # chmod  [ugoa][+-=][rwxXst][,...] foo

Por exemplo, pode fazer com que uma árvore de diretórios tenha como dono o utilizador `foo` e seja partilhada pelo grupo `bar` pelo seguinte:

    # cd /some/location/
    # chown -R foo:bar .
    # chmod -R ug+rwX,o=rX .

Existem mais três bits especiais de permissões.

- O bit set user ID (s ou S em vez do x do utilizador)

- O bit set group ID (s ou S em vez do x do grupo)

- O bit sticky (t ou T em vez do x dos outros)

Aqui o resultado de "`ls -l`" para estes bits é capitalizado se a execução de bits escondidos por estes resultados estiverem não definidos.

Definir set user ID num ficheiro executável permite a um utilizador executar o ficheiro executável com o ID do dono do ficheiro (por exemplo root). De modo semelhante, definir set group ID num ficheiro executável permite a um utilizador executar o ficheiro executável com o ID de grupo do ficheiro (por exemplo root). Porque estas definições podem causar riscos de segurança, activá-las requer precauções extra.

Definir set group ID num diretório activa o esquema de criação de ficheiros ao estilo BSD onde todos os ficheiros criados no diretório pertencem ao grupo do diretório.

Definir o sticky bit num diretório previne que um ficheiro nesse diretório seja removido por um utilizador que não seja o dono do ficheiro. De modo a tornar o conteúdo de um ficheiro seguro em diretórios onde todos têm acesso de escrita, como o "`/tmp`" ou em diretórios onde um grupo tem acesso de escrita, não basta reiniciar a permissão de escrita do ficheiro mas também definir o sticky bit no diretório. Caso contrário, o ficheiro pode ser removido e pode ser criado um novo ficheiro com o mesmo nome por qualquer utilizador que tenha acesso de escrita no diretório.

Aqui estão alguns exemplos interessantes de permissões de ficheiros:

    $ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4
    crw------T 1 root root   108, 0 Oct 16 20:57 /dev/ppp
    -rw-r--r-- 1 root root     2761 Aug 30 10:38 /etc/passwd
    -rw-r----- 1 root shadow   1695 Aug 30 10:38 /etc/shadow
    -rwsr-xr-x 1 root root   973824 Sep 23 20:04 /usr/sbin/exim4
    $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src
    drwxrwxrwt 14 root root  20480 Oct 16 21:25 /tmp
    drwxrwsr-x 10 root staff  4096 Sep 29 22:50 /usr/local
    drwxr-xr-x 10 root root   4096 Oct 11 00:28 /usr/src
    drwxrwsr-x  2 root mail   4096 Oct 15 21:40 /var/mail
    drwxrwxrwt  3 root root   4096 Oct 16 21:20 /var/tmp

Existe um modo numérico alternativo para descrever as permissões do ficheiro com o `chmod`(1). Este modo numérico utiliza 3 ou 4 dígitos em numeração octal (radix=8).

Tabela 1.5. O modo numérico para permissões de ficheiros em comandos `chmod`(1)

digito | significado
--- | ---
1º digito opcional | soma de set user ID (=4), set group ID (=2) e sticky bit (=1)
2º digito | soma das permissões leitura (=4), escrita (=2) e executável (=1) para o utilizador
3º digito | idem para grupo
4º digito | idem para outros

Isto parece complicado mas na verdade é bastante simples. Se observar as primeiras colunas (2-10) do resultado do comando "`ls -l`" e lê-las como uma representação binária (radix=2) das permissões do ficheiros ("-" a ser "0" e "rwx" a ser "1"), os últimos três dígitos do valor de modo numérico para si deverão fazer sentido como uma representação octal (radix=8) das permissões do ficheiro.

Por exemplo, tente o seguinte:

    $ touch foo bar
    $ chmod u=rw,go=r foo
    $ chmod 644 bar
    $ ls -l foo bar
    -rw-r--r-- 1 penguin penguin 0 Oct 16 21:39 bar
    -rw-r--r-- 1 penguin penguin 0 Oct 16 21:35 foo

| Dica
Se necessitar aceder a informação mostrada por "`ls -l`" num script da shell, deve utilizar comandos pertinentes como `test`(1), `stat`(1) e `readlink`(1). Os comandos da própria shell como "`[`" ou "`test`" também podem ser utilizados.

### 1.2.4. Controlo de permissões para ficheiros acabados de criar: umask

As permissões que são aplicadas ao criar ficheiros e diretórios novos é restringida pelo comando embutido da shell `umask`. Veja `dash`(1), `bash`(1) e `builtins`(7).

     (file permissions) = (requested file permissions) & ~(umask value)

Tabela 1.6. Exemplos do valor umask

umask | permissões do ficheiro criadas | permissões do diretório criadas | utilização
--- | --- | --- | ---
`0022` | `-rw-r--r--` | `-rwxr-xr-x` | apenas pode ser escrito pelo utilizador
`0002` | `-rw-rw-r--` | `-rwxrwxr-x` | pode ser escrito pelo grupo

O sistema Debian usa um esquema de grupo privado de utilizadores (UPG). Um UPG é criado sempre que um novo utilizador é adicionado ao sistema. Um UPG tem o mesmo nome que o utilizador para o qual foi criado e esse utilizador é o único membro do UPG. O esquema UPG torna seguro definir a umask para `0002` já que cada utilizador tem o próprio grupo privado dele. (Em algumas variantes de Unix, é bastante comum configurar os utilizadores normais a pertencerem a um único grupo `users` e por segurança é uma boa ideia definir a umask para `0022` nesses casos.)

| Dica
Active UPG ao pôr "`umask 002`" no ficheiro `~/.bashrc`.

### 1.2.5. Permissões para grupos de utilizadores (group)

| Atenção
Certifique-se de que guarda as alterações não guardadas antes de reiniciar o sistema ou de efetuar ações semelhantes.

Pode adicionar um utilizador `pinguim` a um grupo de `aves` em dois passos:

- Alterar a configuração do grupo utilizando uma das seguintes opções:

  - Execute "`sudo usermod -aG bird penguin`".

  - Execute "`sudo adduser penguin bird`". (apenas em sistemas Debian típicos)

  - Execute "`sudo vigr`" para `/etc/group` e "`sudo vigr -s`" para `/etc/gshadow` para acrescentar `penguin` na linha para `bird`.

- Aplicar a configuração utilizando uma das seguintes opções:

  - Reiniciar a frio e iniciar sessão. (Melhor opção)

  - Terminar e reiniciar a sessão através do menu GUI. (Isto pode não funcionar sob um Ambiente de Trabalho moderno.)

É possível remover um utilizador `pinguim` de um grupo de `aves` em dois passos:

- Alterar a configuração do grupo utilizando uma das seguintes opções:

  - Execute "`sudo usermod -rG bird penguin`".

  - Execute "`sudo deluser penguin bird`". (apenas em sistemas Debian típicos)

  - Execute "`sudo vigr`" para `/etc/group` e "`sudo vigr -s`" para `/etc/gshadow` para remover `penguin` na linha para `bird`.

- Aplicar a configuração utilizando uma das seguintes opções:

  - Reiniciar a frio e iniciar sessão. (Melhor opção)

  - Execute "`kill -TERM -1`" e faça algumas ações de correção, como "`systemctl restart NetworkManager.service`".

  - Terminar a sessão através do menu GUI não é uma opção no Gnome Desktop.

Quaisquer tentativas de reinicialização a quente são substitutos frágeis da reinicialização a frio real no sistema de desktop moderno.

| Nota
Em alternativa, pode adicionar dinamicamente utilizadores aos grupos durante o processo de autenticação ao adicionar a linha "`auth optional pam_group.so`" a "`/etc/pam.d/common-auth`" e configurar "`/etc/security/group.conf`". (Veja Capítulo 4, Autenticação e controlos de acesso.)

The hardware devices are just another kind of file on the Debian system. If you have problems accessing devices such as USB flash drive and CD-ROM from a user account, you should make that user a member of the relevant group.

Alguns grupos notáveis disponibilizados pelo sistema permitem aos seus membros aceder a ficheiros e aparelhos particulares sem privilégios de `root`.

Tabela 1.7. Lista de grupos notáveis disponibilizados pelo sistema para acesso a ficheiros

grupo | descrição para ficheiros e aparelhos acessíveis
--- | ---
`dialout` | acesso completo e direto a portas série ("`/dev/ttyS[0-3]`")
`dip` | Acesso limitado a portas série para ligação Dialup IP a peers de confiança
`cdrom` | drives CD-ROM, DVD+/-RW
`audio` | aparelho de áudio
`video` | aparelho de vídeo
`scanner` | scanner(es)
`adm` | logs (relatórios) de monitorização do sistema
`staff` | alguns diretórios para trabalho administrativo júnior: "`/usr/local`", "`/home`"

| Dica
Necessita pertencer ao grupo `dialout` para reconfigurar o modem, ligar para qualquer lado, etc. Mas se o `root` criar ficheiros de configuração pré-definidos para peers de confiança em "`/etc/ppp/peers/`", apenas precisa de pertencer ao grupo `dip` para criar uma ligação Dialup IP para esses peers de confiança a utilizar os comandos `pppd`(8), `pon`(1) e `poff`(1).

Alguns grupos notáveis disponibilizados pelo sistema permitem aos seus membros executar comandos particulares sem privilégios de `root`.

Tabela 1.8. Lista de grupos notáveis disponibilizados pelo sistema para execuções de comandos particulares

grupo | comandos acessíveis
--- | ---
`sudo` | executa qualquer comando com privilégios de super utilizador
`lpadmin` | executar comandos para adicionar, modificar e remover impressoras das bases de dados de impressoras

Para a listagem completa dos utilizadores e grupos disponibilizados pelo sistema, veja a versão recente do documento "Utilizadores e Grupos" em "`/usr/share/doc/base-passwd/users-and-groups.html`" disponibilizado pelo pacote `base-passwd`.

Para comandos de gestão para o sistema de utilizador e grupo veja `passwd`(5), `group`(5), `shadow`(5), `newgrp`(1), `vipw`(8), `vigr`(8) e `pam_group`(8).

### 1.2.6. Marcas temporais (Timestamps)

Existem três tipos de marcas temporais para um ficheiro de GNU/Linux.

Tabela 1.9. Lista dos tipos de marcas temporais

tipo | significado (definição Unix histórica)
--- | ---
mtime | a hora de modificação do ficheiro (`ls -l`)
ctime | a hora de alteração de estado do ficheiro (`ls -lc`)
atime | a hora do último acesso ao ficheiro (`ls -lu`)

| Nota
ctime não é o tempo de criação do ficheiro.

| Nota
O valor atual de atime num sistema GNU/Linux pode ser diferente daquele da definição Unix histórica.

- Sobrescrever um ficheiro altera todos os atributos mtime, ctime e atime do ficheiro.

- Alterar o dono ou as permissões de um ficheiro altera os atributos ctime e atime do ficheiro.

- Ler um ficheiro altera o atributo atime do ficheiro.no sistema Unix histórico.

- Ler um ficheiro altera o atributo atime do ficheiro no sistema GNU/Linux se o sistema de ficheiros dele estiver montado com "`strictatime`".

- Ler um ficheiro pela primeira vez ou após um dia altera o atributo atime do ficheiro no sistema GNU/Linux se o sistema de ficheiros dele for montado com `relatime`". (comportamento predefinido desde Linux 2.6.30)

- Ler um ficheiro não altera o atributo atime do ficheiro no sistema GNU/Linux se o sistema de ficheiros dele for montado com "`noatime`".

| Nota

As opções de montagem "`noatime`" e "`relatime`" são introduzidas para melhorar a performance de leitura do sistema de ficheiros sob casos de utilização normal. Operações simples de leitura de ficheiros sob a opção "`strictatime`" acompanha a operação de escrita que consome tempo para atualizar o atributo atime. Mas o atributo atime é raramente usado excepto para ficheiro `mbox`(5). Veja `mount`(8).

Utilize o comando `touch`(1) para alterar as marcas temporais de ficheiros existentes.

Para representações de data/hora, o comando `ls` produz cadeias de caracteres localizadas à região configurada que não seja o inglês (`"fr_FR.UTF-8`").

    $ LANG=C  ls -l foo
    -rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
    $ LANG=en_US.UTF-8  ls -l foo
    -rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
    $ LANG=fr_FR.UTF-8  ls -l foo
    -rw-rw-r-- 1 penguin penguin 0 oct. 16 21:35 foo

| Dica
Veja Secção 9.3.4, “Amostragem personalizada de hora e data” para personalizar a saída do "`ls -l`".

### 1.2.7. Links (ligações)

Existem dois métodos de associar um ficheiro "`foo`" com um nome de ficheiro diferente "`bar`".

- Ligação rígida

  - Duplicar nome para um ficheiro existente

  - "`ln foo bar`"

- Ligação simbólica ou symlink

  - Ficheiro especial que aponta para outro ficheiro pelo nome

  - "`ln -s foo bar`"

Veja o seguinte exemplo para alterações nas contagens da ligação e as diferenças subtis nos resultados do comando `rm`.

    $ umask 002
    $ echo "Original Content" > foo
    $ ls -li foo
    1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 foo
    $ ln foo bar     # hard link
    $ ln -s foo baz  # symlink
    $ ls -li foo bar baz
    1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 bar
    1450180 lrwxrwxrwx 1 penguin penguin  3 Oct 16 21:47 baz -> foo
    1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 foo
    $ rm foo
    $ echo "New Content" > foo
    $ ls -li foo bar baz
    1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 bar
    1450180 lrwxrwxrwx 1 penguin penguin  3 Oct 16 21:47 baz -> foo
    1450183 -rw-rw-r-- 1 penguin penguin 12 Oct 16 21:48 foo
    $ cat bar
    Original Content
    $ cat baz
    New Content

A ligação rígida pode ser feita dentro do mesmo sistema de ficheiros e partilhar o mesmo número de inode tal como o `ls`(1) com a opção "`-i`" revela.

A ligação simbólica tem sempre permissões nominais de acesso ao ficheiro "`rwxrwxrwx`", conforme mostrado no exemplo acima, com as permissões de acesso efectivas ditadas pelas permissões do ficheiro para o qual aponta.

| Cuidado
Geralmente é boa ideia, de todo, não criar ligações simbólicas complicadas ou ligação rígidas a menos que tenha uma boa razão. Podem causar pesadelos onde a combinação lógica das ligações simbólicas resulta em círculos viciosos no sistema de ficheiros.

| Nota
Geralmente é preferível utilizar ligações simbólicas em vez de ligação rígidas, a menos que tenha boas razões para usar uma ligação rígida.

O diretório "`.`" liga ao diretório onde ele aparece, assim a contagem de ligações de qualquer novo diretório começa em 2. O diretório "`..`" liga ao diretório pai, assim a contagem de ligações do diretório aumenta com a adição de novos sub-diretórios.

Se está a mudar do Windows para Linux, em breve irá ficar claro o quão bem desenhado está a ligação de nomes de ficheiros em Unix, comparada com o equivalente mais próximo em Windows de "atalhos". Devido a estar implementado no sistema de ficheiros, aplicações não conseguem ver nenhuma diferença entre um ficheiro ligado e o original. No caso de ligações rígidas, não há realmente nenhuma diferença.

### 1.2.8. Pipes com nome (FIFOs)

Um pipe com nome é um ficheiro que age como um pipe. Coloca algo no ficheiro e sai pelo outro lado. Por isso é chamado um FIFO, ou Primeiro-a-Entrar-Primeiro-a-Sair: a primeira coisa que pôe no pipe é a primeira coisa a sair pelo outro lado.

Se escrever para um pipe com nome, o processo que escreve à pipe não termina até que a informação que está a ser escrita para o pipe seja lida a partir do pipe. Se ler de um pipe com nome, o processo que lê espera até que não haja mais nada para ler antes de terminar. O tamanho do pipe é sempre zero -- não armazena dados, apenas faz a ligação entre dois processos como a funcionalidade oferecida pelo "`|`" na sintaxe da shell. No entanto, como este pipe tem um nome, os dois processos não têm de estar na mesma linha de comando ou mesmo serem executados pelo mesmo utilizador. Os pipes foram uma inovação de muita influência do Unix.

Por exemplo, tente o seguinte:

    $ cd; mkfifo mypipe
    $ echo "hello" >mypipe & # put into background
    [1] 8022
    $ ls -l mypipe
    prw-rw-r-- 1 penguin penguin 0 Oct 16 21:49 mypipe
    $ cat mypipe
    hello
    [1]+  Done                    echo "hello" >mypipe
    $ ls mypipe
    mypipe
    $ rm mypipe

### 1.2.9. Sockets

Os sockets são usados extensivamente por toda a comunicação da Internet, bases de dados e pelo próprio sistema operativo. São semelhantes a pipes com nome (FIFO) e permitem aos processos trocarem informação mesmo entre computadores diferentes. Para o socket, esses processos não precisam de estar a correr ao mesmo tempo, nem correrem como filhos do mesmo processo pai. Isto é o destino da comunicação inter-processo (IPC). A troca de informação pode ocorrer sobre a rede entre máquinas diferentes. Os dois mais comuns são o socket de Internet e o socket de domínio Unix.

| Dica
"`netstat -an`" dá uma visão geral, muito útil, dos sockets que estão abertos num determinado sistema.

### 1.2.10. Ficheiros de aparelho

Os ficheiros de Aparelhos referem-se a aparelhos físicos ou virtuais no seu sistema, como o seu disco rígido, placa gráfica, monitor ou teclado. Um exemplo de aparelho virtual é a consola, que é representada por "`/dev/console`".

Existem 2 tipos de ficheiros de aparelho.

- Aparelho de Caractere

  - Acedido por um caractere de cada vez

  - 1 caractere = 1 byte

  - Por exemplo, aparelho de teclado, porta serial, …

- Aparelho de Bloco

  - acedido em unidades maiores chamadas blocos

  - 1 bloco > 1 byte

  - Por exemplo, o disco rígido, …

Pode ler e escrever nos ficheiros de aparelho, embora o ficheiro possa muito bem conter dados binários que podem ser uma salada incompreensível para humanos. Escrever dados directamente nestes ficheiros é por vezes útil para diagnosticar problemas com ligações de hardware. Por exemplo, pode despejar um ficheiro de texto para um aparelho de impressora "`/dev/lp0`" ou enviar comandos de modem à porta serial apropriada "`/dev/ttyS0`". Mas, a menos que isto seja feito com cuidado, pode causar problemas maiores. Portanto seja cauteloso.

| Nota
Para o acesso normal a uma impressora, use `lp`(1).

Os números de nós de aparelho são mostrados ao executar `ls`(1) como a seguir.

    $ ls -l /dev/sda /dev/sr0 /dev/ttyS0 /dev/zero
    brw-rw---T  1 root disk     8,  0 Oct 16 20:57 /dev/sda
    brw-rw---T+ 1 root cdrom   11,  0 Oct 16 21:53 /dev/sr0
    crw-rw---T  1 root dialout  4, 64 Oct 16 20:57 /dev/ttyS0
    crw-rw-rw-  1 root root     1,  5 Oct 16 20:57 /dev/zero

- "`/dev/sda`" tem o número maior de aparelho 8 e o número menor de aparelho 0. Isto é acessível para leitura e escrita aos utilizadores que pertencem ao grupo `disk`.

- "`/dev/sr0`" tem o número maior de aparelho 11 e o número menor de aparelho 0. Isto é acessível para leitura e escrita aos utilizadores que pertencem ao grupo `cdrom`.

- "`/dev/ttyS0`" tem o número maior de aparelho 4 e o número menor de aparelho 64. Isto é acessível para leitura e escrita aos utilizadores que pertencem ao grupo `dialout`.

- "`/dev/zero`" tem o número 1 no aparelho maior e o número 5 no número de aparelho menor. Isto é acessível para leitura/escrita a todos.

No sistema Linux moderno, o sistema de ficheiros sob "`/dev/`" é povoado automaticamente pelo mecanismo `udev`(7).

### 1.2.11. Ficheiros de aparelhos especiais

Existem alguns ficheiros de aparelhos especiais.

Tabela 1.10. Lista de ficheiros de aparelhos especiais

ficheiro de aparelho | acção | descrição da resposta
--- | --- | ---
`/dev/null` | ler | retorna o "caractere de fim-de-ficheiro (EOF)"
`/dev/null` | escrever | retorna nada (um poço de despejo de dados sem fundo)
`/dev/zero` | ler | retorna "o caractere `\0` (NULO)" (não é o mesmo que o número zero em ASCII)
`/dev/random` | ler | retorna caracteres aleatórios a partir de um verdadeiro gerador de números aleatórios, a entregar entropia real (lento)
`/dev/urandom` | ler | retorna caracteres aleatórios a partir de um gerador de números pseudo-aleatórios criptograficamente seguros
`/dev/full` | escrever | retorna o erro de disco cheio (ENOSPC)

Estes são usados frequentemente em conjunto com o redireccionamento da shell (veja Secção 1.5.8, “Sequências de comandos típicas e redireccionamento da shell”).

### 1.2.12. procfs e sysfs

Os procfs e sysfs montados em "`/proc`" e "`/sys`" são os pseudo-sistemas-de-ficheiros e expõem estruturas de dados internas do kernel ao espaço de utilizador. Por outras palavras, estas entradas são virtuais, a significar que elas agem como uma janela de conveniência às operações do sistema operativo.

O diretório "`/proc`" contém (entre outras coisas) um sub-diretório para cada processo em execução no sistema, o qual tem o nome do ID do processo (PID). Os utilitários do sistema que acedem à informação de processos, como o `ps`(1), obtêm a informação deles de esta estrutura de diretórios.

Os diretórios sob "`/proc/sys/`" contêm interfaces para alterar certos parâmetros do kernel durante o funcionamento. (Pode fazer o mesmo através do comando especializado `sysctl`(8) ou do ficheiro de configuração/pré-carregamento dele "`/etc/sysctl.conf`".)

As pessoas frequentemente assustam-se quando notam num ficheiro em particular - "`/proc/kcore`" - o qual é geralmente enorme. Isto é (mais ou menos) uma cópia do conteúdo da memória do seu computador. É usado para depuração do kernel. É um ficheiro virtual que aponta à memória do computador, portanto não se preocupe com o tamanho dele.

O diretório em "`/sys`" contém estruturas de dados do kernel exportadas, os seus atributos e as suas ligações entre eles. Também contém interfaces para alterar certos parâmetros do kernel durante o funcionamento.

Veja "`proc.txt(.gz)`", "`sysfs.txt(.gz)`" e outros documentos relacionados na documentação do kernel Linux ("`/usr/share/doc/linux-doc-*/Documentation/filesystems/*`") disponibilizados pelo pacote `linux-doc-*`.

### 1.2.13. tmpfs

O tmpfs é um sistema de ficheiros temporário o qual mantém todos os ficheiros na memória virtual. Os dados de tmpfs na cache de páginas na memória pode ser ir ao espaço swap no disco, conforme necessário.

O diretório "`/run`" é montado como tmpfs no inicio do processo de arranque. Isto ativa a escrita mesmo que o diretório "`/` esteja montado como apenas-leitura. Esta é a nova localização para o armazenamento de ficheiros de estado transitório e substitui várias outras localizações descritas na Filesystem Hierarchy Standard, versão 2.3:

- "`/var/run`" → "`/run`"

- "`/var/lock`" → "`/run/lock`"

- "`/dev/shm`" → "`/run/shm`"

Veja "`tmpfs.txt(.gz)`" na documentação do kernel Linux ("`/usr/share/doc/linux-doc-*/Documentation/filesystems/*`") disponibilizada pelo pacote `linux-doc-*`.

## 1.3. Midnight Commander (MC)

Midnight Commander (MC) é um "Canivete Suíço" GNU para a consola Linux e para outros ambientes de terminal. Isto oferece aos novatos uma experiência de consola movida por menus o que é mais fácil de aprender do que os comandos standard do Unix.

Pode necessitar instalar o pacote Midnight Commander que é intitulado de "`mc`" com o seguinte:

    $ sudo apt-get install mc

Utilize o comando `mc`(1) para explorar o sistema Debian. Esta é a melhor maneira de aprender. Por favor explore algumas localizações interessantes apenas a usar as teclas do cursor e Enter.

- "`/etc`" e os seus sub-diretórios

- e"`/var/log`" os seus sub-diretórios

- "`/usr/share/doc`" os seus sub-diretórios

- "`/usr/sbin`" e "`/usr/bin`"

### 1.3.1. Personalização do MC

De modo a fazer o MC mudar o diretório de trabalho ao sair e `cd` para o diretório, sugiro modificar o "`~/.bashrc`" para incluir um script disponibilizado pelo pacote `mc`.

    . /usr/lib/mc/mc.sh

Veja `mc`(1) (sob a opção "`-P`") para a razão. (Se não compreende exatamente do que estou a falar aqui, pode fazer isto mais tarde.)

### 1.3.2. Iniciar o MC

O MC pode ser iniciado com o seguinte:

    $ mc

O MC toma conta de operações de ficheiros através do menu dele, a requerer esforços mínimos do utilizador. Carregue em F1 para obter ajuda. Pode brincar com o MC apenas com as teclas de cursor e teclas de função.

| Nota
Em algumas consolas, como o `gnome-terminal`(1), as teclas de função podem ser roubadas pelo programa da consola. Pode desativar estas funcionalidades no menu "Preferências" → "Geral" e "Atalhos" do `gnome-terminal`.

Se encontrar problemas com a codificação de caracteres que mostram caracteres com lixo, adicionar "`-a`" à linha de comandos do MC pode ajudar a prevenir problemas.

Se isto não limpar os seus problemas no ecrã com o MC, veja Secção 9.5.6, “A configuração do terminal”.

### 1.3.3. Gestor de ficheiros no MC

O predefinido são dois painéis de diretórios que contêm listas de ficheiros. Outro modo útil é definir a janela da direita para "informação" para ver informações de privilégios de acesso a ficheiros, etc. De seguida existem algumas teclas de atalho essenciais. Com o daemon `gpm`(8) em execução, também se pode usar um rato em consolas de caracteres no Linux. (Certifique-se que carrega na tecla shift para obter o comportamento normal de cortar e colar no MC.)

Tabela 1.11. As teclas de atalho do MC

tecla | tecla de atalho
--- | ---
`F1` | menu de ajuda
`F3` | visualizador interno de ficheiros
`F4` | editor interno
`F9` | ativar o menu de desenrolar
`F10` | sair do Midnight Commander
`Tab` | mover entre duas janelas
`Insert` ou `Ctrl-T` | marcar o ficheiro para uma operação de múltiplos ficheiros como uma cópia
`Del` | apagar o ficheiro (tenha cuidado -- configure o MC para modo de apagar seguro)
Teclas do cursor | auto-explicativo

### 1.3.4. Truques de linha de comandos no MC

- O comando `cd` altera o diretório mostrado no ecrã selcionado.

- `Ctrl-Enter` ou `Alt-Enter` copia um nome de ficheiro para a linha de comandos. Utilize isto com os comandos `cp`(1) e `mv`(1) em conjunto com a edição de linha de comandos.

- `Alt-Tab` mostra escolhas de expansão de nomes de ficheiros da shell.

- Pode-se especificar os diretórios de inicio para ambas janelas como argumentos ao MC; por exemplo, "`mc /etc /root`".

- `Esc` + `n-key` → `Fn` (i.e., `Esc` + `1` → `F1`, etc.; `Esc` + `0` → `F10`)

- Carregar em `Esc` antes da tecla tem o mesmo efeito que carregar em `Alt` e na tecla em conjunto; isto é, carregar em `Esc` + `c` para `Alt-C`. `Esc` é chamada uma meta-tecla e por vezes mencionada como "`M-`".

### 1.3.5. O editor interno em MC

O editor interno tem um esquema de cortar-e-colar interessante. Pressionar `F3` marca o inicio da seleção, um segundo `F3` marca o final da seleção e destaca a seleção. Depois pode mover o cursor. Se pressionar F6, a área selcionada é movida à localização do cursor. Se pressionar F5, a área selcionada é copiada e inserida na localização do cursor. `F2` salva o ficheiro. `F10` fá-lo sair. A maioria das teclas do cursor funcionam de modo intuitivo.

Este editor pode ser iniciado directamente num ficheiro a usar um dos seguintes comandos.

    $ mc -e filename_to_edit

    $ mcedit filename_to_edit

Este não é um editor de várias janelas, mas podem-se utilizar várias consolas de Linux para se conseguir o mesmo efeito. Para copiar entre janelas, utilize as teclas Alt-Fn para mudar entre consolas virtuais utilize "Ficheiro→Inserir ficheiro" ou "Ficheiro→Copiar para ficheiro" para mover uma porção de um ficheiro para outro ficheiro.

Este editor interno pode ser substituído por qualquer editor externo à escolha.

Além disso, muitos programas utilizam as variáveis de ambiente "`$EDITOR`" ou "`$VISUAL`" para decidir que editor utilizar. Se não está confortável com o `vim`(1) ou com o `nano`(1), pode definir a "`mcedit`" a adicionar as seguintes linhas ao "`~/.bashrc`".

    export EDITOR=mcedit
    export VISUAL=mcedit

Recomendo definir isto para "`vim`" se possível.

Se não está confortável com o `vim`(1), pode continuar a utilizar o `mcedit`(1) para a maioria das tarefas de manutenção do sistema.

### 1.3.6. O visualizador interno no MC

MC é um visualizador muito inteligente. Esta é uma grande ferramenta para procurar palavras em documentos. Uso sempre isto para ficheiros no diretório "`/usr/share/doc`". Esta é a maneira mais rápida para navegar por entre grandes quantidades de informação de Linux. Este visualizador pode ser iniciado diretamente a usar um dos seguintes comandos:

    $ mc -v path/to/filename_to_view

    $ mcview path/to/filename_to_view

### 1.3.7. Funcionalidades de auto-arranque do MC

Carregue em Enter num ficheiro e o programa apropriado lida com o conteúdo do ficheiro (veja Secção 9.4.11, “Personalizar o programa a ser iniciado”). Esta é uma funcionalidade muito conveniente do MC.

Tabela 1.12. A reacção à tecla enter no MC

tipo de ficheiro | reacção à tecla enter
--- | ---
ficheiro executável | executa comando
ficheiro man | canaliza o conteúdo para software de visualização
ficheiro html | canaliza o conteúdo para explorador web
ficheiros "`*.tar.gz`" e "`*.deb`" | explora o conteúdo dele como se fosse um sub-diretório

De modo a permitir esta visualização e funcionalidades de ficheiros virtuais , os ficheiros a visualizar não devem ser definidos como executáveis. Mude o estado deles com o `chmod`(1) ou via menu ficheiro do MC.

### 1.3.8. Sistema de ficheiros virtual do MC

MC pode ser utilizado para aceder a ficheiros através da Internet. Vá ao menu premindo `F9`, "`Enter`" e "`h`" para ativar o sistema de ficheiros Shell. Introduza um URL na forma "`sh://[user@]machine[:options]/[remote-dir]`", que recupera um diretório remoto que aparece como um diretório local utilizando o `ssh`.

## 1.4. O ambiente de trabalho estilo Unix básico

Apesar do MC lhe permitir fazer quase tudo, é muito importante aprender a utilizar as ferramentas de linha de comandos invocadas a partir da prompt da shell e familiarizar-se com o ambiente de trabalho do tipo Unix.

### 1.4.1. A shell de login

Como a shell de inicio de sessão pode ser usada por alguns programas de inicialização do sistema, é prudente mantê-la como `bash`(1) e evitar mudar a shell de inicio de sessão com `chsh`(1).

Se quiser utilizar uma linha de comandos interativa diferente, defina-a a partir da configuração do emulador de terminal GUI ou inicie-a a partir de `~/.bashrc`, e.g., colocando aí "`exec /usr/bin/zsh -i -l`" ou "`exec /usr/bin/fish -i -l`".

Tabela 1.13. Lista de programas da shell

pacote | popcon | tamanho | Shell do POSIX | descrição
--- | --- | --- | --- | ---
`bash` | V:866, I:999 | 7277 | Sim | Bash: a GNU Bourne Again SHell (o standard de facto)
`bash-completion` | V:35, I:953 | 1952 | N/D | conclusão programável para a shell bash
`dash` | V:906, I:998 | 207 | Sim | Shell Almquist, bom para scripts da shell
`zsh` | V:40, I:70 | 2509 | Sim | Z shell: a shell standard com muitas melhorias
`tcsh` | V:4, I:15 | 1366 | Não | Shell TENEX C: uma versão melhorada de Berkeley csh
`mksh` | V:5, I:8 | 7713 | Sim | Uma versão de Korn shell
`csh` | V:1, I:5 | 348 | Não | OpenBSD shell C, uma versão do Berkeley csh
`sash` | V:0, I:5 | 1335 | Sim | shell Stand-alone com comandos embutidos (Não se destina a "`/usr/bin/sh`" standard)
`ksh` | I:8 | 65 | Sim | a real, versão AT&T da Korn shell
`rc` | V:0, I:0 | 182 | Não | implementação da rc shell AT&T Plan 9
`posh` | V:0, I:0 | 187 | Sim | Policy-compliant Ordinary SHell (deriva da `pdksh`)

| Dica
Apesar das shells tipo POSIX partilharem a sintaxe básica, podem diferir no comportamento em coisas tão básicas como variáveis de shell e expansões glob. Por favor verifique as suas documentações para detalhes.

Neste capítulo do tutorial, a shell interactiva significa sempre `bash`.

### 1.4.2. Personalizar bash

Pode personalizar o comportamento da `bash`(1) em "`~/.bashrc`".

Por exemplo, tente o seguinte.

    # enable bash-completion
    if ! shopt -oq posix; then
      if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi

    # CD upon exiting MC
    . /usr/lib/mc/mc.sh

    # set CDPATH to a good one
    CDPATH=.:/usr/share/doc:~:~/Desktop:~
    export CDPATH

    PATH="${PATH+$PATH:}/usr/sbin:/sbin"
    # set PATH so it includes user's private bin if it exists
    if [ -d ~/bin ] ; then
      PATH="~/bin${PATH+:$PATH}"
    fi
    export PATH

    EDITOR=vim
    export EDITOR

| Dica
Pode encontrar mais dicas de personalização da `bash`, como os Secção 9.3.6, “Comandos coloridos”, em Capítulo 9, Dicas do sistema.

| Dica
O pacote `bash-completion` activa preenchimento automático programável para `bash`.

### 1.4.3. Teclas especiais

No ambiente do tipo Unix, existem algumas combinações de teclas que têm significados especiais. Por favor note que numa consola de caracteres normal do Linux, apenas as teclas `Ctrl` e `Alt` do lado esquerdo funcionam como se espera. Aqui estão algumas combinações de teclas notáveis para se lembrar.

Tabela 1.14. Lista de teclas de atalho para bash

tecla | descrição do atalho da tecla
--- | ---
`Ctrl-U` | apagar a linha antes do cursor
`Ctrl-H` | apagar um caractere antes do cursor
`Ctrl-D` | termina a entrada (sai da shell se estiver a usar uma shell)
`Ctrl-C` | termina um programa em funcionamento
`Ctrl-Z` | pára temporariamente o programa ao movê-lo para segundo plano
`Ctrl-S` | pára a saída ao ecrã
`Ctrl-Q` | reactiva a saída para o ecrã
`Ctrl-Alt-Del` | reinicia/pára o sistema, veja `inittab`(5)
`Left-Alt-key` (opcionalmente, `tecla-do-Windows`) | meta-tecla para o Emacs e a UI semelhante
`Seta-para-cima` | inicia a busca no histórico de comandos em `bash`
`Ctrl-R` | inicia o histórico de comandos incremental em `bash`
`Tab` | completa a entrada do nome de ficheiro para a linha de comandos em `bash`
`Ctrl-V` `Tab` | entrada `Tab` sem expansão para a linha de comandos em `bash`

| Dica
A funcionalidade do terminal de `Ctrl-S` pode ser desactivada a usar `stty`(1).

### 1.4.4. Operações com o rato

Operações de rato para texto no sistema Debian misturam 2 estilos com algumas variações:

- Operações tradicionais do rato ao estilo Unix:

  - utilizar 3 botões (clicar)

  - usar PRIMÁRIA

  - utilizado por aplicações X como o `xterm` e aplicações de texto na consola Linux

- Operações do rato ao estilo GUI moderno:

  - utilizar 2 botões (arrastar + clicar)

  - utilizar PRIMÁRIA e ÁREA DE TRANSFERÊNCIA

  - utilizado em aplicações GUI modernas, como o `gnome-terminal`

Tabela 1.15. Lista de operações do rato e ações-chave relacionadas no Debian

acção | resposta
--- | ---
Clique-esquerdo-e-arrastar do rato | selecionar intervalo como seleção PRIMÁRIA
Clique-esquerdo | selecionar o início do intervalo para a seleção PRIMÁRIA
Clique com botão direito (tradicional) | selecionar o fim do intervalo para a seleção PRIMÁRIA
Clique com botão direito (moderno) | menu dependente do contexto (cortar/copiar/colar)
Clique com o botão do meio ou `Shift-Ins` | inserir seleção PRIMÁRIA no cursor
`Ctrl-X` | cortar a seleção PRIMÁRIA para a ÁREA DE TRANSFERÊNCIA
`Ctrl-C` (`Shift-Ctrl-C` no terminal) | copia a seleção PRIMÁRIA para a ÁREA DE TRANSFERÊNCIA
`Ctrl-V` | colar ÁREA DE TRANSFERÊNCIA no cursor

Aqui, a seleção PRIMÁRIA é o intervalo de texto realçado. Dentro do programa de terminal, `Shift-Ctrl-C` é utilizado em vez disso para evitar terminar um programa em execução.

A roda central nos modernos ratos de roda é considerada o botão central do rato e pode ser usada como terceiro botão ou clique-central. Clicar nos botões esquerdo e direito ao mesmo tempo serve como clique-central em situações de sistema de rato de 2 botões.

De modo a utilizar um rato nas consolas de caracteres Linux, é necessário ter `o gpm`(8) a correr como daemon.

### 1.4.5. O pager

O comando `less`(1) é o paginador avançado (navegador de conteúdo de ficheiros). Ele lê o ficheiro especificado pelo seu argumento de comando ou pela sua entrada standard. Carregue em "`h`" se precisar de ajuda enquanto explora com o comando `less`. Pode fazer muito mais do que o `more`(1) e pode ser ampliado ao executar "`eval $(lesspipe)`" ou "`eval $(lessfile)`" no script de arranque de shell. Veja mais em "`/usr/share/doc/less/LESSOPEN`". A opção "`-R`" permite saída em caracteres em bruto e activa sequências de escape de cores ANSI. Veja `less`(1).

| Dica
No comando `less`, escreva "`h`" para ver o ecrã de ajuda, escreva "`/`" ou "`?`" para procurar uma cadeia de caracteres e escreva "`-i`" para alterar a sensibilidade às maiúsculas e minúsculas.

### 1.4.6. O editor de texto

Deve tornar-se conhecedor de uma das variantes dos programas Vim ou Emacs que são populares em sistemas tipo Unix.

Acho que habituar-se aos comandos do Vim é a coisa certa a fazer, pois o editor Vim está sempre presente no mundo Linux/Unix. (Na verdade, o `vi` original ou o novo `nvi` são programas que vai encontrar em todo o lado. Escolho o Vim para novatos porque é bastante semelhante e mais poderoso já que lhe oferece ajuda através da tecla `F1` .)

Pode escolher o Emacs ou o XEmacs como o seu editor favorito, que é realmente uma outra boa escolha, particularmente para a programação. O Emacs tem também um leque de outras funcionalidades, incluindo funcionar como um leitor de news, editor de diretório, programa de mail, etc. Quando é usado para programação ou edição de scripts de shell, é inteligente para reconhecer o formato daquilo em que está a trabalhar e tenta disponibilizar assistência. Algumas pessoas afirmam que o único programa que necessitam em Linux é o Emacs. 10 minutos a aprender Emacs agora pode poupar-lhe horas mais tarde. Ter o manual do Emacs GNU para referência quando se aprende Emacs é altamente recomendado.

Todos estes programas vêm normalmente com um programa tutor para queaprenda a usá-los pela prática. Arranque o Vim ao escrever "`vim`" e carregue an tecla F1. Deverá ler pelo menos as primeiras 35 linhas. Depois faça o curso de treino online ao mover o cursor para "`|tutor|`" e pressionar `Ctrl-]`.

| Nota
Os bons editores, como o Vim e o Emacs, podem lidar corretamente com UTF-8 e outros textos com codificações exóticas. É uma boa ideia usar o ambiente GUI com o locale UTF-8 e instalar as fontes e programas necessários para tal. Os editores têm opções para definir a codificação do ficheiro independentemente do ambiente GUI. Por favor consulte a documentação acerca de texto multibyte.

### 1.4.7. Definir um editor de texto predefinido

Debian vem com uma quantia de editores diferentes. Recomendamos instalar o pacote `vim`, como mencionado anteriormente.

Debian disponibiliza acesso unificado ao editor predefinido do sistema através do comando "`/usr/bin/editor`" para que outros programas (p.e., `reportbug`(1)) possam invocá-lo. Pode alterá-lo com o seguinte.

    $ sudo update-alternatives --config editor

A escolha de "`/usr/bin/vim.basic`" em vez de "`/usr/bin/vim.tiny`" é uma recomendação minha para novatos pois suporta destaque de sintaxe.

| Dica
Muitos programas utilizam as variáveis de ambiente "`$EDITOR`" ou "`$VISUAL`" para decidir qual o editor que vai utilizar (veja Secção 1.3.5, “O editor interno em MC” e Secção 9.4.11, “Personalizar o programa a ser iniciado”). Para consistência no sistema Debian, defina estas para "`/usr/bin/editor`". (Historicamente, "`$EDITOR`" era "`ed`" e "`$VISUAL`" era "`vi`".)

### 1.4.8. Utilizando o vim

O recente `vim`(1) inicia-se na opção sã "`nocompatible`" e entra no modo `NORMAL`.[1]

Tabela 1.16. Lista de teclas básicas do Vim

modo | toques de tecla | acção
--- | --- | ---
`NORMAL` | `:help|only` | apresentar o ficheiro de ajuda
`NORMAL` | `:e filename.ext` | abre uma nova memória intermédia para editar o ficheiro `filename.ext`
`NORMAL` | `:w` | substituir a memória intermédia atual pelo ficheiro original
`NORMAL` | `:w filename.ext` | escreve a memória intermédia atual em `filename.ext`
`NORMAL` | `:q` | sair do `vim`
`NORMAL` | `:q!` | forçar a saída do `vim`
`NORMAL` | `:only` | fechar todas as outras janelas abertas divididas
`NORMAL` | `:set nocompatible?` | verificar se `vim` está no modo "são" `nocompatible`
`NORMAL` | `:set nocompatible` | definir o `vim` para modo limpo `nocompatible`
`NORMAL` | `i` | entrar no modo `INSERT`
`NORMAL` | `R` | entrar no modo `REPLACE`
`NORMAL` | `v` | entrar no modo `VISUAL`
`NORMAL` | `V` | entrar no modo `VISUAL` em linha
`NORMAL` | Ctrl-`V` | entrar no modo `VISUAL` em bloco
exceto `TERMINAL-JOB` | Tecla `ESC` | entrar no modo `NORMAL`
`NORMAL` | `:term` | entrar no modo `TERMINAL-JOB`
`TERMINAL-NORMAL` | `i` | entrar no modo `TERMINAL-JOB`
`TERMINAL-JOB` | Ctrl-`W` `N` (ou Ctrl-`\` Ctrl-`N`) | entrar no modo `TERMINAL-NORMAL`
`TERMINAL-JOB` | Ctrl-`W` `:` | entre no modo `Ex`- em modo`TERMINAL-NORMAL`

Por favor, use o programa "`vimtutor`" para aprender `vim` através de um curso tutorial interativo.

O programa `vim` muda o seu comportamento em relação às teclas digitadas com base no modo. A digitação de teclas para buffer é feita principalmente nos modos `INSERT` e `REPLACE`. A deslocação do cursor é feita principalmente no modo `NORMAL`. A seleção interativa é feita no modo `VISUAL`. Escrever "`:`" no modo `NORMAL` muda o seu modo para o modo `Ex`. O modo `Ex` aceita comandos.

| Dica
O Vim vem com o pacote Netrw. O Netrw suporta a leitura de ficheiros, a escrita de ficheiros, a navegação em diretórios através de uma rede e a navegação local! Experimente o Netrw com "`vim .`" (um ponto como argumento) e leia o seu manual em "`:help netrw`".

Para a configuração avançada do `vim`, consulte Secção 9.2, “Personalizar o vim”.

### 1.4.9. Gravar as atividades da shell

O resultado do comando na shell pode sair fora do seu ecrã e ficar perdido para sempre. É uma boa prática registar as atividades da shell num ficheiro para rever mais tarde. Este tipo de registo é essencial quando executa quaisquer tarefas de administração do sistema.

| Dica
O novo Vim (versão>=8.2) pode ser usado para gravar as atividades da shell de forma limpa usando o modo `TERMINAL-JOB`. Ver Secção 1.4.8, “Utilizando o vim”.

O método básico de gravar a atividade da shell é corrê-la sob `script`(1).

Por exemplo, tente o seguinte:

    $ script
    Script started, file is typescript

Faz quaisquer comandos de shell sob `script`.

Carregue em `Ctrl-D` para terminar o `script`.

    $ vim typescript

Veja Secção 9.1.1, “Gravar as atividades da shell de modo limpo” .

### 1.4.10. Comandos básicos de Unix

Vamos aprender comandos básicos do Unix. Aqui Uso "Unix" no sentido genérico dele. Geralmente qualquer SO clone do Unix oferece comandos equivalentes. O sistema Debian não é excepção. Não se preocupe se alguns comandos não funcionarem como deseja por agora. Se for utilizado `alias` na shell, as saídas dos comandos correspondentes serão diferentes. Estes exemplos não se destinam a ser executados por esta ordem.

Tente os seguintes comandos a partir da conta de utilizador não-privilegiado.

Tabela 1.17. lista dos comandos Unix básicos

comando | descrição
--- | ---
`pwd` | mostrar o nome do diretório atual
`whoami` | mostrar o nome do utilizador atual
`id` | mostrar a identidade do utilizador atual (nome, uid, gid e grupos associados)
`file foo` | mostrar o tipo de ficheiro para o ficheiro "`foo`"
`type -p nome_do_comando` | mostrar a localização de um ficheiro do comando "`nome_do_comando`"
`which nome_do_comando` | , ,
`type nome_do_comando` | mostrar informação do comando "`nome_do_comando`"
`apropos palavra_chave` | mostrar comandos relacionados com a "`palavra_chave`"
`man -k palavra_chave` | , ,
`whatis nome_do_comando` | mostrar a explicação de uma linha para o comando "`nome_do_comando`"
`man -a nome_do_comando` | mostrar a explicação do comando "`nome_do_comando`" (estilo Unix)
`info nome_do_comando` | mostrar uma explicação longa do comando "`nome_do_comando`" (estilo GNU)
`ls` | listar o conteúdo do diretório (ficheiros e diretórios não escondidos)
`ls -a` | listar o conteúdo do diretório (todos os ficheiros e diretórios)
`ls -A` | listar o conteúdo do diretório (quase todos os ficheiros e diretórios, isto é, salta o "`..`" e "`.`")
`ls -la` | listar todo o conteúdo do diretório com informação detalhada
`ls -lai` | listar todo o conteúdo do diretório com número de inode e informação detalhada
`ls -d` | listar todos os diretórios sob o diretório atual
`tree` | mostrar o conteúdo da árvore de ficheiros
`lsof foo` | listar o estado aberto do ficheiro "`foo`"
`lsof -p pid` | listar ficheiros abertos pelo processo de ID: "`pid`"
`mkdir foo` | criar um novo diretório "`foo`" no diretório atual
`rmdir foo` | remover um diretório "`foo`" no diretório atual
`cd foo` | mudar o diretório para o diretório "`foo`" no diretório atual ou no diretório listado na variável "`$CDPATH`"
`cd /` | mudar o diretório para o diretório raiz
`cd` | mudar ao diretório home do utilizador atual
`cd /foo` | mudar para o diretório de caminho absoluto "`/foo`"
`cd ..` | mudar ao diretório pai
`cd ~foo` | mudar ao diretório home do utilizador "`foo`"
`cd -` | mudar ao diretório anterior
`</etc/motd pager` | mostrar o conteúdo de "`/etc/motd`" a utilizar o paginador predefinido
`touch junkfile` | criar um ficheiro vazio "`junkfile`"
`cp foo bar` | copiar um ficheiro "`foo`" existente para um novo ficheiro "`bar`"
`rm junkfile` | remover um ficheiro "`junkfile`"
`mv foo bar` | renomear um ficheiro "`foo`" existente para um novo nome "`bar`" ("`bar`" não pode existir)
`mv foo bar` | mover um ficheiro "`foo`" existente para uma nova localização `bar/foo`" (o diretório "`bar`" tem de existir)
`mv foo bar/baz` | mover um ficheiro existente "`foo`" para uma nova localização com um novo nome "`bar/baz`" (o diretório "`bar`" tem de existir mas o diretório "`bar/baz`" não pode existir)
`chmod 600 foo` | tornar um ficheiro existente "`foo`" proibido de ser lido e ser escrito por outras pessoas (não executável para todos)
`chmod 644 foo` | tornar um ficheiro existente "`foo`" permissível de ser lido mas proibido de ser escrito por outras pessoas (não executável para todos)
`chmod 755 foo` | tornar um ficheiro existente "`foo`" permissível de ser lido mas proibido de ser escrito por outras pessoas (executável para todos)
`find . -name modelo` | procurar nomes de ficheiros correspondentes a usar um "`modelo`" de shell (lento)
`locate -d . modelo` | procurar nomes de ficheiros correspondentes a usar um "`modelo`" de shell (mais rápido ao usar uma base de dados gerada regularmente)
`grep -e "modelo" *.html` | procura um "`modelo`" em todos os ficheiros terminados com "`.html`" no diretório atual e mostra-os todos
`top` | mostrar informação de processos a usar ecrã completo, carregue em "`q`" para sair
`ps aux | pager` | mostrar informação dos processos a correr a usar saída ao estilo BSD
`ps -ef | pager` | mostrar informação dos processos a correr a usar saída ao estilo Unix system-V
`ps aux | grep -e "[e]xim4*"` | mostrar todos os processos que correm "`exim`" e "`exim4`"
`ps axf | pager` | mostrar a informação de todos os processos a correr com saída em arte de ASCII
`kill 1234` | matar todos os processos identificados pelo ID de processo: "1234"
`gzip foo` | comprimir "`foo`" para criar "`foo.gz`" a usar a codificação Lempel-Ziv (LZ77)
`gunzip foo.gz` | descomprimir "`foo.gz`" para criar "`foo`"
`bzip2 foo` | comprimir "`foo`" para criar "`foo.bz2`" a usar o algoritmo de compressão de texto organizado em blocos Burrows-Wheeler e codificação Huffman (melhor compressão que `gzip`)
`bunzip2 foo.bz2` | descomprimir "`foo.bz2`" para criar "`foo`"
`xz foo` | comprimir "`foo`" para criar "`foo.xz`" a usar o algoritmo de cadeia Lempel–Ziv–Markov (melhor compressão que `bzip2`)
`unxz foo.xz` | descomprimir "`foo.xz`" para criar "`foo`"
`tar -xvf foo.tar` | extrair ficheiros do arquivo "`foo.tar`"
`tar -xvzf foo.tar.gz` | extrair ficheiros do arquivo gzipado "`foo.tar.gz`"
`tar -xvjf foo.tar.bz2` | extrair ficheiros do arquivo "`foo.tar.bz2`"
`tar -xvJf foo.tar.xz` | extrair ficheiros do arquivo "`foo.tar.xz`"
`tar -cvf foo.tar bar/` | arquivar o conteúdo da pasta "`bar/`" no arquivo "`foo.tar`"
`tar -cvzf foo.tar.gz bar/` | arquivar o conteúdo da pasta "`bar/`" no arquivo comprimido "`foo.tar.gz`"
`tar -cvjf foo.tar.bz2 bar/` | arquivar o conteúdo da pasta "`bar/`" no arquivo "`foo.tar.bz2`"
`tar -cvJf foo.tar.xz bar/` | arquivar o conteúdo da pasta "`bar/`" no arquivo "`foo.tar.xz`"
`zcat README.gz | pager` | mostrar o conteúdo do "`README.gz`" comprimido a usar o paginador predefinido
`zcat README.gz > foo` | criar o ficheiro "`foo`" com o conteúdo descomprimido de "`README.gz`"
`zcat README.gz >> foo` | acrescentar o conteúdo descomprimido de "`README.gz`" ao final do ficheiro "`foo`" (se ele não existir, é primeiro criado)

| Nota

Unix tem a tradição de esconder os nomes de ficheiros que começam por "`.`". Eles são tradicionalmente ficheiros que contêm informação de configuração e preferências do utilizador.

Para o comando `cd`, veja `builtins`(7).

O paginador predefinido da vastidão do sistema Debian é o `more`(1), o qual não pode deslocar para trás. A instalar o pacote `less` a usar o comando "`apt-get install less`", o `less`(1) torna-se o paginador predefinido e pode deslocar para trás com as teclas do cursor.

O "`[`" e "`]`" na expressão regular do comando "`ps aux | grep -e "[e]xim4*"`" em cima activam `grep` para evitar a correspondência consigo próprio. O "`4*`" na expressão regular significa 0 ou mais repetições do caractere "`4`" assim activa o `grep` a corresponder a ambos "`exim`" e "`exim4`". Apesar de "`*`" ser usado no glob de nome de ficheiro da shell e na expressão regular, os seus significados são diferentes. Aprenda a expressão regular a partir do `grep`(1).

Por favor percorra os diretórios e espreite no sistema a usar os comandos em cima como treino. Se tiver questões sobre qualquer comando de consola, por favor certifique-se de ler o manual dele.

Por exemplo, tente o seguinte:

    $ man man
    $ man bash
    $ man builtins
    $ man grep
    $ man ls

Pode ser um pouco difícil de habituar-se ao estilo dos manuais, porque são bastante concisos, particularmente os mais antigos, muito tradicionais. Mas assim que se habituar a eles, vai apreciar a brevidade deles.

Por favor note que muitos comandos do tipo Unix incluindo os GNU e BSD mostram informação breve de ajuda se os invocar numa das seguintes formas (ou sem argumentos nalguns casos).

    $ commandname --help
    $ commandname -h

## 1.5. O comando simples da shell

Agora tem alguma prática de como utilizar o sistema Debian. Vamos ver mais fundo no mecanismo da execução de comandos no sistema Debian. Aqui simplifiquei a realidade para o novato. Veja `bash`(1) para a explicação exata.

Um comando simples é uma sequência de componentes.

1. Atribuições de variáveis (opcional)

2. Nome do comando

3. Argumentos (opcional)

4. Re-direcções (opcional: `>` , `>>` , `<` , `<<` , etc.)

5. Operador de controle (opcional: `&&` , `||` , nova-linha , `;` , `&` , `(` , `)` )

### 1.5.1. Execução do comando e variável de ambiente

Os valores de algumas variáveis de ambiente modificam o comportamento de alguns comandos de Unix.

Os valores predefinidos das variáveis de ambiente são definidos inicialmente pelo sistema PAM e depois alguns deles podem ser redefinidos por alguns programas.

- O sistema PAM, como o `pam_env`, pode definir variáveis de ambiente em "`/etc/pam.conf`", "`/etc/environment`" e "`/etc/default/locale`".

- Os gestoesr de ecrã, como o `gdm3`, podem repor as variáveis de ambiente para a sessão GUI através de "`~/.profile`".

- A inicialização do programa específico do utilizador pode repor variáveis de ambiente através de "`~/.profile`", "`~/.bash_profile`" e "`~/.bashrc`".

### 1.5.2. A variável "`$LANG`"

A configuração regional predefinida é definida na variável de ambiente "`$LANG`" e é configurada como "`LANG=xx_YY.UTF-8`" pelo instalador ou pela configuração GUI subsequente, por exemplo, "Definições" → "Região & Idioma" → "Idioma" / "Formatos" para o GNOME.

| Nota
Recomendo que configure o ambiente do sistema por agora apenas pela variável "`$LANG`" e se mantenha afastado das variáveis "`$LC_*`" a menos que seja absolutamente necessário.

O valor completo do locale dado à variável "`$LANG`" consiste em 3 partes: "`xx_YY.ZZZZ`".

Tabela 1.18. As 3 partes do valor locale

valor locale | significado
--- | ---
`xx` | códigos de idioma ISO 639 (minúsculas) como em "en"
`YY` | códigos de idioma ISO 3166 (maiúsculas) como em "US"
`ZZZZ` | conjunto de codificação, definido sempre como "UTF-8"

Tabela 1.19. Lista de recomendações de locale

recomendação de locale | Idioma (área)
--- | ---
`en_US.UTF-8` | Inglês (EUA)
`en_GB.UTF-8` | Inglês (Grã-Bretanha)
`fr_FR.UTF-8` | Francês (França)
`de_DE.UTF-8` | Alemão (Alemanha)
`it_IT.UTF-8` | Italiano (Itália)
`es_ES.UTF-8` | Espanhol (Espanha)
`ca_ES.UTF-8` | Catalão (Espanha)
`sv_SE.UTF-8` | Sueco (Suécia)
`pt_BR.UTF-8` | Português (Brasil)
`ru_RU.UTF-8` | Russo (Rússia)
`zh_CN.UTF-8` | Chinês (Rep. Popular da China)
`zh_TW.UTF-8` | Chinês (Taiwan R.O.C.)
`ja_JP.UTF-8` | Japonês (Japão)
`ko_KR.UTF-8` | Coreano (República da Coreia)
`vi_VN.UTF-8` | Vietnamita (Vietname)

A execução de comando típica utiliza uma sequência de linha de shell como o seguinte.

    $ echo $LANG
    en_US.UTF-8
    $ date -u
    Wed 19 May 2021 03:18:43 PM UTC
    $ LANG=fr_FR.UTF-8 date -u
    mer. 19 mai 2021 15:19:02 UTC

Aqui, o programa `date`(1) é executado com diferentes valores de configuração regional.

- Para o primeiro comando, "`$LANG`" é definida ao valor locale predefinido do sistema "`en_US.UTF-8`".

- Para o segundo comando, "`$LANG`" é definida ao valor locale UTF-8 Francês "`fr_FR.UTF-8`".

A maioria das execuções de comandos geralmente não têm definições de variáveis de ambiente precedentes. Para o exemplo acima, pode executar em alternativa o seguinte:

    $ LANG=fr_FR.UTF-8
    $ date -u
    mer. 19 mai 2021 15:19:24 UTC

| Dica
Quando preencher um relatório de bug, é uma boa ideia executar e verificar o comando em "`en_US.UTF-8`", se está num ambiente que não seja Inglês.

Para mais detalhes sobre configuração do locale, veja Secção 8.1, “O locale”.

### 1.5.3. A variável "`$PATH`"

Quando escreve um comando na shell, a shell procura o comando na lista de diretórios contida na variável de ambiente "`$PATH`". O valor da variável de ambiente "`$PATH`" também é chamado o caminho de procura da shell.

Na instalação Debian, por omissão, a variável de ambiente "`$PATH`" das contas de utilizadores pode não incluir "`/usr/sbin`" nem "`/usr/sbin`". Por exemplo, o comando `ifconfig` necessita ser chamado com o caminho completo como "`/usr/sbin/ifconfig`". (De modo idêntico, o comando `ip` está localizado em "`/usr/bin`".)

Pode alterar a variável de ambiente "`$PATH`" da shell Bash pelos ficheiros "`~/.bash_profile`" ou "`~/.bashrc`".

### 1.5.4. A variável "`$HOME`"

Muitos comandos armazenam configurações específicas do utilizador no diretório home do utilizador e mudam o comportamento dele de acordo com o conteúdo dele. O diretório de utilizador é identificado pela variável de ambiente "`$HOME`".

Tabela 1.20. Lista de valores "`$HOME`"

valor de "`$HOME`" | situação de execução do programa
--- | ---
`/` | programa executado pelo processo de init (daemon)
`/root` | programa executado a partir da shell de root normal
`/home/utilizador_normal` | programa executado a partir da shell de utilizador normal
`/home/utilizador_normal` | programa executado a partir menu do ambiente GUI do utilizador normal
`/home/utilizador_normal` | programa executado como root com o "`programa sudo`"
`/root` | programa executado como root com o "`programa sudo -H`"

| Dica
A shell expande "`~/`" ao diretório home do utilizador atual, isto é, "`$HOME/`". A shell expande "`~foo/`" ao diretório home de `foo`, isto é, "`/home/foo/`".

Veja Secção 12.1.5, “Variáveis de ambiente do shell” se `$HOME` não está disponível para o seu programa.

### 1.5.5. Opções da linha de comandos

Alguns comandos recebem argumentos. Os argumentos que começam com um "`-`" ou "`--`" são chamados opções e controlam o comportamento do comando.

    $ date
    Thu 20 May 2021 01:08:08 AM JST
    $ date -R
    Thu, 20 May 2021 01:08:12 +0900

Aqui o argumento de linha de comandos "`-R`" altera o comportamento de `date`(1) para gerar uma string da data compatível com RFC2822.

### 1.5.6. Glob da shell

Frequentemente deseja trabalhar com um conjunto de ficheiros sem os digitar a todos. O modelo de expansão do nome de ficheiro a utilizar a glob da shell , (por vezes referida como wildcards), facilita esta necessidade.

Tabela 1.21. Padrões glob da shell

modelo glob da shell | descrição de regra de correspondência
--- | ---
`*` | nome de ficheiro (segmento) não iniciado por "`.`"
`.*` | nome de ficheiro (segmento) iniciado por "`.`"
`?` | exatamente um caractere
`[…]` | exatamente um caractere com qualquer caractere envolvido em colchetes
`[a-z]` | exatamente um caractere com qualquer caractere entre "`a`" e "`z`"
`[^…]` | exatamente um caractere que não seja qualquer caractere envolvido em colchetes (a excluir "`^`")

Por exemplo, tente o seguinte:

    $ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt
    $ echo *.txt
    1.txt 2.txt
    $ echo *
    1.txt 2.txt 3.c 4.h
    $ echo *.[hc]
    3.c 4.h
    $ echo .*
    . .. .5.txt ..6.txt
    $ echo .*[^.]*
    .5.txt ..6.txt
    $ echo [^1-3]*
    4.h
    $ cd ..; rm -rf junk

Veja `glob`(7).

| Nota
Ao contrário da expansão de nome de ficheiro da shell, o modelo de shell "`*`" testado em `find`(1) com o teste "`-name`" etc., corresponde ao "`.`" inicial do nome de ficheiro. (Nova funcionalidade POSIX)

| Nota
BASH pode ser moldado a alterar o comportamento de glob dele com as opções shopt dele embutidas como as "`dotglob`", "`noglob`", "`nocaseglob`", "`nullglob`", "`extglob`", etc. Veja `bash`(1).

### 1.5.7. Valor de retorno do comando

Cada comando retorna o estado de saída dele (na variável: "`$?`") como o valor de retorno.

Tabela 1.22. Códigos de saída do comando

estado de saída do comando | valor de retorno numérico | valor de retorno lógico
--- | --- | ---
sucesso | zero, 0 | TRUE
erro | não-zero, -1 | FALSE

Por exemplo, tente o seguinte.

    $ [ 1 = 1 ] ; echo $?
    0
    $ [ 1 = 2 ] ; echo $?
    1

| Nota
Por favor note que, no contexto lógico da shell, sucesso é tratado como o VERDADEIRO lógico o qual tem 0 (zero) como valor. De certa maneira isto não é intuitivo e necessita ser lembrado aqui.

### 1.5.8. Sequências de comandos típicas e redireccionamento da shell

Vamos tentar lembrar-nos dos seguintes idiomas de comando de shell escritos numa linha como parte de um comando de shell.

Tabela 1.23. Idiomas de comandos de shell

idioma do comando | descrição
--- | ---
`comando &` | execução em segundo plano do `comando` na sub-shell
`comando1 | comando2` | liga em pipe a saída standard do `comando1` à entrada standard do `comando2` (execução concorrente)
`comando1 2>&1 | comando2` | liga em pipe a saídas standard e o erro standard do `comando1` à entrada standard do `comando2` (execução concorrente)
`comando1 ; comando2` | executa o `comando1` e o `comando2` sequencialmente
`comando1 && comando2` | executa o `comando1`; se tiver sucesso, executa o `comando2` sequencialmente (retorna sucesso se ambos `comando1` e `comando2` tiverem sucesso)
`comando1 || comando2` | executa o `comando1`; se não tiver sucesso, executa o `comando2` sequencialmente (retorna sucesso se o `comando1` ou o `comando2` tiverem sucesso
`comando > foo` | redirecciona a saída standard do `comando` para o ficheiro `foo` (sobrescreve)
`comando 2> foo` | redirecciona o erro standard do `comando` para o ficheiro `foo` (sobrescreve)
`comando >> foo` | redirecciona a saída standard do `comando` para o ficheiro `foo` (acrescenta)
`comando 2>> foo` | redireciona o erro standard do `comando` ao ficheiro `foo` (acrescenta)
`comando > foo 2>&1` | redirecciona ambos saída standard e erro standard do `comando` para o ficheiro `foo`
`comando < foo` | redirecciona a entrada standard do `comando` ao ficheiro `foo`
`comando << delimitador` | redirecciona a entrada standard do `comando` para as seguintes linhas até que o "`delimitador`" seja atingido (documentar aqui)
`comando <<- delimitador` | redirecciona a entrada standard do `comando` às seguintes linhas até que o "`delimitador`" seja atingido (aqui documento, os caracteres tab de inicio são retirados das linhas de entrada)

O sistema Debian é um sistema de multi-tarefa. Os trabalhos em segundo plano permitem aos utilizadores correrem vários programas numa única shell. A gestão dos processos em segundo plano envolve os embutidos da shell: `jobs`, `fg`, `bg` e `kill`. Por favor leia as secções de bash(1) sob "SINAIS", "CONTROLE DE TAREFAS" e `builtins`(1).

Por exemplo, tente o seguinte:

    $ </etc/motd pager

    $ pager </etc/motd

    $ pager /etc/motd

    $ cat /etc/motd | pager

Apesar dos 4 exemplos de redireccionamentos de shell mostrarem a mesma coisa, o último exemplo corre um comando `cat` extra e desperdiça recursos sem nenhuma razão.

A shell permite-lhe abrir ficheiros a usar o `exec` embutido com um descritor de ficheiro arbitrário.

    $ echo Hello >foo
    $ exec 3<foo 4>bar  # open files
    $ cat <&3 >&4       # redirect stdin to 3, stdout to 4
    $ exec 3<&- 4>&-    # close files
    $ cat bar
    Hello

O descritores de ficheiro 0-2 são predefinidos.

Tabela 1.24. Descritores de ficheiro predefinido

aparelho | descrição | descritor de ficheiro
--- | --- | ---
`stdin` | entrada standard | 0
`stdout` | saída standard | 1
`stderr` | erro standard | 2

### 1.5.9. Comando alias

Pode definir um nome alternativo (alias) para um comando frequentemente utilizado.

Por exemplo, tente o seguinte:

    $ alias la='ls -la'

Agora, "`la`" funciona como atalho para "`ls -la`" o que lista todos os ficheiros no formato de lista longa.

Pode listar quaisquer nomes alternativos existentes com o `alias` (veja `bash`(1) sob "COMANDOS EMBUTIDOS NA SHELL").

    $ alias
    ...
    alias la='ls -la'

Pode identificar o caminho exacto ou a identidade do comando com `type` (veja `bash`(1) sob "COMANDOS EMBUTIDOS DA SHELL").

Por exemplo, tente o seguinte:

    $ type ls
    ls is hashed (/bin/ls)
    $ type la
    la is aliased to ls -la
    $ type echo
    echo is a shell builtin
    $ type file
    file is /usr/bin/file

Aqui o `ls` foi procurado recentemente enquanto o "`file`" não foi, assim o "`ls`" tem "hash", isto é, a shell tem um registo interno para o acesso rápido à localização do comando "`ls`".

| Dica
Veja Secção 9.3.6, “Comandos coloridos”.

## 1.6. Processamento de texto estilo Unix

Em ambientes de trabalho tipo Unix, o processamento de texto é feito ao canalizar texto por cadeias de ferramentas standard de processamento de texto. Esta foi outra inovação crucial do Unix.

### 1.6.1. Ferramentas de texto de Unix

Existem algumas ferramentas standard de processamento de texto que são muito usadas nos sistemas tipo Unix.

- Não é utilizada nenhuma expressão regular:

  - `cat`(1) concatena ficheiros e escreve o conteúdo inteiro.

  - `tac`(1) concatena ficheiros e escreve-os em reverso.

  - `cut`(1) seleciona partes de linhas e escreve-as.

  - `head`(1) escreve a parte inicial de ficheiros.

  - `tail`(1) escreve a parte final de ficheiros.

  - `sort`(1) organiza as linhas de ficheiros de texto.

  - `uniq`(1) remove linhas duplicadas de um ficheiro organizado.

  - `tr`(1) traduz ou apaga caracteres.

  - `diff`(1) compara ficheiros linha a linha.

- É utilizada uma expressão regular básica (BRE):

  - `ed`(1) é um editor de linhas primitivo.

  - `sed`(1) é um editor de streams.

  - `grep`(1) faz coincidir texto com padrões.

  - `vim`(1) é um editor de ecrã.

  - `emacs`(1) é um editor de écran. (BRE de certo modo extensa)

- É utilizada uma expressão regular extensa (ERE):

  - `awk`(1) faz processamento de texto simples.

  - `egrep`(1) faz coincidir texto com padrões.

  - `tcl`(3tcl) pode fazer todo o processamento de texto concebível: Veja `re_syntax`(3). Bastante usado com `tk`(3tk).

  - `perl`(1) pode fazer todo o processamento de texto concebível. Veja `perlre`(1).

  - `pcre2grep`(1) do pacote `pcre2-util` corresponde texto com padrões Perl Compatible Regular Expressions (PCRE).

  - `python`(1) com o módulo `re` pode fazer todo o processamento de texto concebível. Veja "`/usr/share/doc/python/html/index.html`".

Se não tiver a certeza do que estes comandos fazem, por favor utilize "`man comando`" para descobri-lo por si.

| Nota
A ordem de ordenação e a expressão de intervalo dependem da configuração regional. Se desejar obter um comportamento tradicional para um comando, utilize a configuração regional C ou C.UTF-8 em vez da UTF-8 normal (ver Secção 8.1, “O locale”).

| Nota
As expressões regulares Perl (`perlre`(1)), Perl Compatible Regular Expressions (PCRE) e expressões regulares Python oferecidas pelo módulo `re` têm muitas extensões comuns ao ERE normal.

### 1.6.2. Expressões regulares

As expressões regulares são utilizadas em muitas ferramentas de processamento de texto. São análogas aos "globs" da shell, mas são mais complicadas e poderosas.

A expressão regular descreve o modelo de correspondência e é feita de caracteres de texto e de meta-caracteres.

Um meta-caractere é apenas um caractere com um significado especial. Existem 2 estilos principais, BRE e ERE, a depender das ferramentas de texto conforme descrito acima.

Tabela 1.25. Meta-caracteres para BRE e ERE

BRE | ERE | descrição da expressão regular
--- | --- | ---
`\ . [ ] ^ $ *` | `\ . [ ] ^ $ *` | meta-caracteres comuns
`\+ \? \( \) \{ \} \|` |  | BRE apenas "`\`" metacaracteres escapados
| `+ ? ( ) { } |` | ERE apenas "`\`" meta-caracteres sem escape
`c` | `c` | corresponde a não-meta-caractere "`c`"
`\c` | `\c` | corresponde a um caractere literal "`c`" mesmo se "`c`" é um meta-caractere por si só
`.` | `.` | corresponde a qualquer caractere incluindo nova linha
`^` | `^` | posição no início de uma cadeia
`$` | `$` | posição no fim de uma cadeia
`\<` | `\<` | posição no início de uma palavra
`\>` | `\>` | posição no final de uma palavra
`[abc…]` | `[abc…]` | corresponde a quaisquer caracteres em "`abc…`"
`[^abc…]` | `[^abc…]` | corresponde a quaisquer caracteres excepto em "`abc…`"
`r*` | `r*` | corresponde a zero ou mais expressões regulares identificadas por "`r`"
`r\+` | `r+` | corresponde a uma ou mais expressões regulares identificadas por "`r`"
`r\?` | `r?` | corresponde a zero ou uma expressão regular identificada por "`r`"
`r1\|r2` | `r1|r2` | corresponde a uma das expressões regulares identificadas por "`r1`" ou "`r2`"
`\(r1\|r2\)` | `(r1|r2)` | corresponde a uma das expressões regulares identificadas por "`r1`" ou "`r2`" e trata-as como uma expressão regular entre colchetes

A expressão regular do `emacs` é basicamente BRE mas foi estendida para tratar "`+`" e "`?`" como meta-caracteres como em ERE. Assim, não há necessidade de os 'escapar' com "`\`" na expressão regular do `emacs`.

`grep`(1) pode ser utilizado para executar a pesquisa de texto com expressão regular.

Por exemplo, tente o seguinte:

    $ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL
    GNU GENERAL PUBLIC LICENSE
    GNU GENERAL PUBLIC LICENSE
    Yoyodyne, Inc., hereby disclaims all copyright interest in the program

| Dica
Veja Secção 9.3.6, “Comandos coloridos”.

### 1.6.3. Expressões de substituição

Para a expressão de substituição, alguns caracteres têm significados especiais.

Tabela 1.26. A expressão de substituição

expressão de substituição | descrição do texto para substituir a expressão de substituição
--- | ---
`&` | que expressão regular corresponde (use `\&` no `emacs`)
`\n` | que nº entre colchetes da expressão regular correspondeu (a ser "n" um número)

Para cadeia de substituição Perl, "$&" é usado em vez de "&" e "$n" é usado em vez de "\n".

Por exemplo, tente o seguinte:

    $ echo zzz1abc2efg3hij4 | \
    sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/'
    zzz=1abc2efg3hij4=
    $ echo zzz1abc2efg3hij4 | \
    sed -E -e 's/(1[a-z]*)[0-9]*(.*)$/=&=/'
    zzz=1abc2efg3hij4=
    $ echo zzz1abc2efg3hij4 | \
    perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=$&=/'
    zzz=1abc2efg3hij4=
    $ echo zzz1abc2efg3hij4 | \
    sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/'
    zzzefg3hij4===1abc
    $ echo zzz1abc2efg3hij4 | \
    sed -E -e 's/(1[a-z]*)[0-9]*(.*)$/\2===\1/'
    zzzefg3hij4===1abc
    $ echo zzz1abc2efg3hij4 | \
    perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/'
    zzzefg3hij4===1abc

Aqui por favor preste atenção extra ao estilo da expressão regular entre colchetes e como as cadeias correspondentes são utilizadas no processo de substituição de texto nas diferentes ferramentas.

Estas expressões regulares também podem ser utilizadas para movimentos do cursor e acções de substituição de texto em alguns editores.

A barra descendente "`\`" no fim da linha na linha de comandos da shell 'escapa' a nova linha como um caractere de espaço em branco e continua a entrada na linha de comandos da shell na próxima linha.

Por favor leia todos os manuais relacionados para aprender estes comandos.

### 1.6.4. Substituição global com expressões regulares

O comando `ed`(1) pode substituir todas as instâncias de "`FROM_REGEX`" por "`TO_TEXT`" em "`file`".

    $ ed file <<EOF
    ,s/FROM_REGEX/TO_TEXT/g
    w
    q
    EOF

O comando `sed`(1) pode substituir todas as instâncias de "`FROM_REGEX`" por "`TO_TEXT`" em "`file`".

    $ sed -i -e 's/FROM_REGEX/TO_TEXT/g' file

O comando `vim`(1) pode substituir todas as instâncias de "`FROM_REGEX`" com "`TO_TEXT`" em "`ficheiro`" ao usar comandos `ex`(1).

    $ vim '+%s/FROM_REGEX/TO_TEXT/gc' '+update' '+q' file

| Dica
A flag "`c`" em cima assegura confirmação interactiva para cada substituição.

Múltiplos ficheiros ("`ficheiro1`", "`ficheiro2`",e "`ficheiro3`") podem ser processados com expressões regulares à semelhança com `vim`(1) ou `perl`(1).

    $ vim '+argdo %s/FROM_REGEX/TO_TEXT/gce|update' '+q' file1 file2 file3

| Dica
A bandeira "`e`" em cima previne o erro "Nenhuma correspondência" de quebrar um mapeamento.

    $ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' file1 file2 file3

no exemplo perl(1), "`-i`" é para edição no-lugar de cada ficheiro objetivo e "`-p`" é para um ciclo implícito a todos os ficheiros fornecidos.

| Dica
O uso do argumento "`-i.bak`" em vez de "`-i`" mantêm cada ficheiro original ao adicionar "`.bak`" ao seu nome de ficheiro. Isto torna a recuperação de erros mais fácil para substituições complexas.

| Nota
`ed`(1) e `vim`(1) são BRE; `perl`(1) é ERE.

### 1.6.5. Extrair dados de tabela de ficheiro de texto

Vamos considerar um ficheiro de texto chamado "`DPL`" no qual alguns nomes de líderes de projectos Debian pré-2004 e as suas datas de iniciação estão listados num formato separado por espaços.

    Ian     Murdock   August  1993
    Bruce   Perens    April   1996
    Ian     Jackson   January 1998
    Wichert Akkerman  January 1999
    Ben     Collins   April   2001
    Bdale   Garbee    April   2002
    Martin  Michlmayr March   2003

| Dica
Veja "Uma História Breve de Debian" para o histórico de liderança de Debian mais recente.

O awk é frequentemente utilizado para extrair dados deste tipo de ficheiros.

Por exemplo, tente o seguinte:

    $ awk '{ print $3 }' <DPL                   # month started
    August
    April
    January
    January
    April
    April
    March
    $ awk '($1=="Ian") { print }' <DPL          # DPL called Ian
    Ian     Murdock   August  1993
    Ian     Jackson   January 1998
    $ awk '($2=="Perens") { print $3,$4 }' <DPL # When Perens started
    April 1996

Shells como a Bash também podem ser utilizadas para analisar este tipo de ficheiro.

Por exemplo, tente o seguinte:

    $ while read first last month year; do
        echo $month
      done <DPL
    ... same output as the first Awk example

Aqui, o comando embutido `read` usa caracteres em "`$IFS`" (separadores de campo internos) para dividir linhas em palavras.

Se alterar "`$IFS`" a "`:`", pode analisar "`/etc/passwd`" facilmente com a shell.

    $ oldIFS="$IFS"   # save old value
    $ IFS=':'
    $ while read user password uid gid rest_of_line; do
        if [ "$user" = "bozo" ]; then
          echo "$user's ID is $uid"
        fi
      done < /etc/passwd
    bozo's ID is 1000
    $ IFS="$oldIFS"   # restore old value

(Se o Awk for utilizado para fazer o equivalente, utilize "`FS=':'`" para definir o campo separador.)

O IFS também é usado pela shell para dividir resultados de expansão de parâmetros, substituição de comandos e expansão aritmética. Estas não ocorrem em palavras dentro de citações simples ou duplas. O valor predefinido do IFS é espaço, tab e nova-linha combinados.

Tenha cuidado ao usar estes truques IFS da shell. Podem acontecer coisas estranhas, quando a shell interpreta partes do script como a entrada dela.

    $ IFS=":,"                        # use ":" and "," as IFS
    $ echo IFS=$IFS,   IFS="$IFS"     # echo is a Bash builtin
    IFS=  , IFS=:,
    $ date -R                         # just a command output
    Sat, 23 Aug 2003 08:30:15 +0200
    $ echo $(date -R)                 # sub shell --> input to main shell
    Sat  23 Aug 2003 08 30 36 +0200
    $ unset IFS                       # reset IFS to the default
    $ echo $(date -R)
    Sat, 23 Aug 2003 08:30:50 +0200

### 1.6.6. Trechos de script para canalizar comandos em pipe

Os seguintes scripts fazem coisas bonitas como parte de um pipe.

Tabela 1.27. Lista de trechos de script para canalizar comandos em pipe

trecho de script (escrito numa linha) | efeito do comando
--- | ---
`find /usr -print` | encontra todos os ficheiros sob "`/usr`"
`seq 1 100` | escreve 1 até 100
`| xargs -n 1 command` | corre o comando repetidamente com cada item do pipe como seu argumento
`| xargs -n 1 echo` | divide itens separados por espaços do pipe em linhas
`| xargs echo` | junta todas as linhas do pipe numa linha
`| grep -e regex_pattern` | extrai as linhas do pipe que contêm o padrão_da_expressão_regular
`| grep -v -e regex_pattern` | extrai as linhas do pipe que não contêm o padrão_da_expressão_regular
`| cut -d: -f3 -` | extrai do pipe o terceiro campo separado por "`:`" (ficheiro passwd etc.)
`| awk '{ print $3 }'` | extrai do pipe o terceiro campo separado por espaços
`| awk -F'\t' '{ print $3 }'` | extrai do pipe o terceiro campo separado por tab
`| col -bx` | remove os backspace e expande as tabs para espaços
`| expand -` | expande separadores
`| sort| uniq` | organiza e remove duplicados
`| tr 'A-Z' 'a-z'` | converte maiúsculas para minúsculas
`| tr -d '\n'` | concatena linhas numa linha
`| tr -d '\r'` | remover CR
`| sed 's/^/# /'` | adiciona "`#`" ao inicio de cada linha
`| sed 's/\.ext//g'` | remover "`.ext`"
`| sed -n -e 2p` | escreve a segunda linha
`| head -n 2 -` | escreve as primeiras duas linhas
`| tail -n 2 -` | escreve as últimas duas linhas

Um script de shell de uma linha pode fazer ciclos sobre muitos ficheiros a usar o `find`(1) e `xargs`(1) para executar tarefas bastante complicadas. Veja Secção 10.1.5, “Idiomas para a seleção de ficheiros” e Secção 9.4.9, “Repetir um ciclo de comandos sobre ficheiros”.

Quando a utilização dos modos interativos da shell se torna muito complicada, por favor considere escrever um script de shell (veja Secção 12.1, “O script de shell”).

[1] Mesmo o `vim` mais antigo pode iniciar no modo "`nocompatible`" (não compatível), iniciando-o com a opção "`-N`".

Prefácio |  | Capítulo 2. Gestão de pacotes Debian