Capítulo 1. Manuais de GNU/Linux

Índice

1.1. Bases de consola
1.1.1. A linha de comandos shell
1.1.2. A linha de comandos shell sob X
1.1.3. A conta root
1.1.4. A linha de comandos shell do root
1.1.5. GUIs de ferramentas de administração do sistema
1.1.6. Consolas virtuais
1.1.7. Como abandonar a linha de comandos
1.1.8. Como desligar o sistema
1.1.9. Recuperar uma consola sã
1.1.10. Sugestões de pacote adicionais para o novato
1.1.11. Uma conta de utilizador extra
1.1.12. Configuração do sudo
1.1.13. Hora de brincar
1.2. Sistema de ficheiros tipo Unix
1.2.1. Noções básicas de ficheiros Unix.
1.2.2. Internos do sistema de ficheiros
1.2.3. Permissões do sistema de ficheiros
1.2.4. Control de permissões para ficheiros acabados de criar: umask
1.2.5. Permissões para grupos de utilizadores (group)
1.2.6. Marcas temporais (Timestamps)
1.2.7. Links (ligações)
1.2.8. Pipes nomeados (FIFOs)
1.2.9. Sockets
1.2.10. Ficheiros de dispositivo
1.2.11. Ficheiros de dispositivos especiais
1.2.12. procfs e sysfs
1.3. Midnight Commander (MC)
1.3.1. Personalização do MC
1.3.2. Arrancar o MC
1.3.3. Gestor de ficheiros em MC
1.3.4. Truques de linha de comandos no MC
1.3.5. O editor interno em MC
1.3.6. O visualizador interno no MC
1.3.7. Funcionalidades de auto-arranque do MC
1.3.8. Sistema de ficheiros FTP virtual no MC
1.4. O ambiente de trabalho estilo Unix básico
1.4.1. A shell de login
1.4.2. Personalizar o bash
1.4.3. Teclas especiais
1.4.4. Operações do rato ao estilo Unix
1.4.5. O pager
1.4.6. O editor de texto
1.4.7. Definir um editor de texto predefinido
1.4.8. Personalizar o vim
1.4.9. Gravar as actividades da shell
1.4.10. Comandos Unix básicos
1.5. O simples comando de shell
1.5.1. Execução de comando e variável de ambiente
1.5.2. variável "$LANG"
1.5.3. variável "$PATH"
1.5.4. variável "$HOME"
1.5.5. Opções de linha de comandos
1.5.6. Glob da shell
1.5.7. Valor de retorno do comando
1.5.8. Sequências de comandos típicas e redireccionamento da shell
1.5.9. Comando alias
1.6. Processamento de texto estilo Unix
1.6.1. Ferramentas de texto de Unix
1.6.2. Expressões regulares
1.6.3. Expressões de substituição
1.6.4. Substituição global com expressões regulares
1.6.5. Extrair dados de tabela de ficheiro de texto
1.6.6. Trechos de script para canalizar comandos em pipe

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

O desenho poderoso da Debian GNU/Linux vem do sistema operativo Unix, isto é, um sistema operativo de multi-utilizador e multi-tarefas. Você precisa aprender a tirar vantagem do poder desta 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 do GNU/Linux, por isto rouba-lhe muita informação útil.

[Nota] Nota

Se você tem usado qualquer sistema do tipo Unix por uns tempos com ferramentas de linha de comandos, provavelmente já sabe tudo o que Eu explico aqui. Por favor use isto como um teste de realidade e refrescamento.

1.1. Bases de consola

1.1.1. A linha de comandos shell

Após arrancar o sistema, é-lhe apresentado o ecrã de login baseado em caracteres se você não instalar o X Window System com um gestor de ecrã como o gdm. Suponha que o nome da sua máquina é foo, o aviso de login parece-se com o seguinte.

foo login:

Se você instalou um ambiente GUI tal como o GNOME ou KDE, então você pode obter o aviso de login com Ctrl-Alt-F1, e você pode regressar ao ambiente GUI via Alt-F7 (veja Secção 1.1.6, “Consolas virtuais” em baixo para mais informação).

No aviso de login, você escreve o seu nome de utilizador, ex pinguim, e carrega na tecla Enter, depois escreve a sua palavra-passe e carrega na tecla Enter mais uma vez.

[Nota] Nota

Seguindo 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 é geralmente 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 um aviso de comando.

Debian GNU/Linux lenny/sid foo tty1
foo login: pinguim
Password:
Last login: Sun Apr 22 09:29:34 2007 on tty1
Linux snoopy 2.6.20-1-amd64 #1 SMP Sun Apr 15 20:25:49 UTC 2007 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.
foo:~$

Aqui, a parte principal da mensagem de boas vindas pode ser personalizada ao editar o ficheiro "/etc/motd.tail". A primeira linha é gerada a partir de informação do sistema usando "uname -snrvm".

Agora você está na shell. A shell interpreta os seus comandos.

1.1.2. A linha de comandos shell sob X

Se você instalou o X Window System com um gestor de ecrã como o gdm do GNOME ao seleccionar a tarefa "Ambiente de Trabalho" durante a instalação, é-lhe apresentado o ecrã de login gráfico após arrancar o sistema. Você escreve o seu nome de utilizador e a sua palavra passe para iniciar sessão na conta de utilizador não-privilegiado. Use a tecla Tab para navegar entre nome de utilizador e palavra-passe ou use o rato e o clique principal.

Você pode obter o aviso de shell sob X ao iniciar um programa emulador de terminal x tal como o gnome-terminal(1), rxvt(1) ou o xterm(1). Sob o ambiente de trabalho GNOME, clicar em "Aplicações" → "Acessórios" → "Terminal" é suficiente.

Pode ver também a secção abaixo Secção 1.1.6, “Consolas virtuais”.

Sob alguns outros sistema de Ambiente de trabalho (como o fluxbox), pode não existir um ponto de partida óbvio para o menu. Se isto acontecer, tente o clique direito no centro do ecrã e espere que aparece um menu.

1.1.3. A conta root

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

  • Lê, escreve e remove quaisquer ficheiros no sistema independentemente das suas permissões

  • Define o dono e permissões de quaisquer ficheiros no sistema

  • Define a palavra-passe de quaisquer utilizadores não privilegiados do sistema.

  • Login em quaisquer contas sem as suas palavras-passe

Este poder ilimitado da conta root querer que você seja atencioso e responsável quando a usa.

[Atenção] Atenção

Nunca partilhe a palavra-passe de root com outros.

[Nota] Nota

As permissões de um ficheiro (incluindo dispositivos de hardware como CD-ROM etc. que 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 do uso da conta root ser um modo rápido de testar este tipo de situação, a sua resolução deve ser feita através da definição correcta das permissões do ficheiro e membros do 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 ganhar o aviso de shell de root ao usar a palavra-passe do root.

  • Escreva root no aviso de login baseado em caracteres.

  • Clique "Aplicações" → "Acessórios" → "Terminal de Root", sob o ambiente de trabalho GNOME.

  • Escreva "su -l" no aviso de shell de qualquer utilizador.

    • Isto não preserva o ambiente do utilizador actual.

  • Escreva "su" no aviso de shell de qualquer utilizador.

    • Isto preserva algum do ambiente do utilizador actual.

1.1.5. GUIs de ferramentas de administração do sistema

Quando o menu do seu ambiente de trabalho não inicia ferramentas GUI de administração do sistema automaticamente com os privilégios apropriados, você pode iniciá-las a partir do aviso de shell de root do emulador dum terminal X, tal como gnome-terminal(1), rxvt(1), ou xterm(1). Veja Secção 1.1.4, “A linha de comandos shell do root” e Secção 7.8.4, “Correr clientes X como root”.

[Atenção] Atenção

Nunca inicie o gestor de ecrã/sessão X sob a conta do root ao escrever root no aviso de um gestor de ecrã como o gdm(1).

[Atenção] Atenção

Nunca execute programas GUI remotos não-de-confiança sob o X Window quando é mostrada informação critica porque pode "espiar" o seu ecrã X.

1.1.6. Consolas virtuais

No sistema Debian predefinido, existem seis consolas alternáveis de caracteres tipo VT100 disponíveis para arrancar a shell de comandos directamente na máquina Linux. A menos que você esteja num ambiente GUI, você pode mudar entre consolas virtuais ao pressionar Left-Alt-key e umas das teclas F1F6 simultâneamente. Cada consola de caracteres permite login independente para a conta e oferece o ambiente de multi-utilizador. Este ambiente de multi-utilizador é uma grande funcionalidade do Unix, e muito viciante.

Se você está sob o X Window System, pode ganhar acesso à consola 1 ao pressionar as teclas Ctrl-Alt-F1, isto é, a tecla-Ctrl-esquerda, a tecla-Alt-esquerda, e a tecla-F1 são pressionadas em conjunto. Você pode regressar ao X Window System, que corre normalmente na consola virtual 7, ao pressionar Alt-F7.

Você pode alternativamente mudar para outra consola virtual, por exemplo para a consola 1, a partir da linha de comandos.

# chvt 1

1.1.7. Como abandonar a linha de comandos

Você escreve Ctrl-D, isto é, a tecla Ctrl esquerda e a tecla d pressionadas em conjunto, no aviso de comando para fechar a actividade da shell. Se estiver na consola de caracteres, você retorna ao aviso de login com isto. Mesmo que estes caracteres de controle sejam referidos como "control D" com letra maiúscula, você não precisa de pressionar a tecla Shift. A expressão curta, ^D, também é usada para Ctrl-D. Alternativamente, você pode escrever "exit".

Se você está no emulador-terminal-x(1), você pode fechar a janela do emulador-terminal-x com isto.

1.1.8. Como desligar o sistema

Tal como qualquer outro SO moderno onde a operação de ficheiros involve colocar dados em cache em memória para melhoria da performance, o sistema Debian precisa de um processo de desligar apropriado antes que a energia possa ser desligada com segurança. 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, você pode ter de pressionar o botão de energia por alguns segundos após o procedimento de desligar.)

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

# shutdown -h now

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

# poweroff -i -f

Alternativamente, você pode teclar Ctrl-Alt-Delete (A tecla-Ctrl-esquerda, a tecla-Alt-esquerda, e Delete são pressionadas em conjunto) para desligar o sistema se "/etc/inittab" possuir "ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now" nele. Veja inittab(5) para detalhes.

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

1.1.9. Recuperar uma consola sã

Quando o ecrã fica agressivo após fazer coisas estranhas tal como "cat <algum-ficheiro-binário>", escreva "reset" na linha de comandos. Você poderá não ver o comando a aparecer quando o escreve. Você também pode usar "clear" para limpar o ecrã.

1.1.10. Sugestões de pacote 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 iniciantes para começar com o seguinte.

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

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

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

pacote popcon tamanho descrição
mc * V:11, I:26 6600 Um gestor de ficheiro de écran completo em modo de texto
sudo * V:44, I:73 1365 Um programa que permite privilégios de root limitados aos utilizadores
vim * V:16, I:37 1829 O editor de texto de Unix Vi IMproved, um editor de texto de programadores (versão standard)
vim-tiny * V:13, I:94 766 O editor de texto de Unix Vi IMproved, um editor de texto de programadores (versão compacta)
emacs23 * V:4, I:8 13009 O Projecto Emacs do GNU, o editor de texto extensível baseado no Lisp (versão 23)
w3m * V:24, I:86 1911 Exploradores WWW de modo de texto
gpm * V:2, I:3 584 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:84 408 Documentação do Projecto Debian, (FAQ do Debian) e outros documentos
debian-policy * I:6 3592 Manual de Politicas Debian e documentos relacionados
developers-reference * I:0.8 1424 Guias e informação para programadores de Debian
maint-guide * I:0.5 740 Guia dos Novos Maintainers de Debian
debian-history * I:0.2 3760 História do Projecto Debian
debian-faq * I:75 1212 FAQ do Debian
doc-linux-text * I:83 8616 Manuais de Linux e FAQ (texto)
doc-linux-html * I:0.5 62564 Manuais de Linux e FAQ (html)
sysadmin-guide * I:0.2 964 O Guia do Administrador de Sistema Debian

Você pode instalar alguns destes pacotes com o seguinte.

# apt-get install nome_do_pacote

1.1.11. Uma conta de utilizador extra

Se você não deseja usar a sua conta de utilizador principal para as seguintes actividades de treino, você pode criar uma conta de utilizador para treinos, por exemplo fish fazendo o seguinte.

# adduser fish

Responder a todas as questões.

Isto cria uma nova conta chamada fish. Após praticar, você pode remover esta conta de utilizador e o seu directório home fazendo o seguinte.

# deluser --remove-home fish

1.1.12. Configuração do sudo

Para a estação de trabalho típica de único utilizador como o ambiente de trabalho do sistema Debian no PC portátil, é comum implementar uma configuração simples do sudo(8) como se segue 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

Alternativamente, é também comum fazer como se segue 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 o qual você administra e onde você é o único utilizador.

[Atenção] Atenção

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

[Cuidado] Cuidado

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

[Cuidado] Cuidado

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] Nota

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

[Nota] Nota

Com uma configuração mais atenciosa e cuidadosa, 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 você possa saber quem fez o quê. Por outro lado, você pode querer que mais ninguém tenha tais privilégios.

1.1.13. Hora de brincar

Agora você 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 deveria ler o Manual de Segurança Debian.

Nós aprendemos o sistema Debian como um sistema tipo Unix com o seguinte.

1.2. Sistema de ficheiros tipo Unix

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

Estes ficheiros e directórios podem estar espalhados por vários dispositivos. O mount(8) serve para anexar o sistema de ficheiros encontrado em algum dispositivo à grande árvore. Reciprocamente, o umount(8) desanexa-os de novo. Nos kernels 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 "/share/doc/linux-doc-2.6.*/Documentation/filesystems/".

Os directórios no sistema Unix são chamados pastas em alguns 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 directório root (raiz) significa a raiz do sistema de ficheiros referida simplesmente como "/". Não confundir isto com o directório pessoal do utilizador root: "/root".

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

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

  • Todos os nomes de ficheiro totalmente qualificados começam com o directório "/", e existe um "/" entre cada directório ou ficheiro no nome de ficheiros. O primeiro "/" é o directório de nível de topo, e os outros "/"' separam os sub-directórios sucessivos, até que se chegue à última entrada que é o nome do ficheiro real. As palavras usadas 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 "us.map.gz" sozinho como um nome de ficheiro.

  • O directório raiz tem alguns ramos, tais como "/etc/" e "/usr/". Estes sub-directórios por sua vez ramificam-se em mais sub-directórios, tais como "/etc/init.d/" e "/usr/local/". Tudo visto em colectivo é chamada a árvore de directórios. Você pode pensar num nome de ficheiro absoluto como a rota desde a base da árvore ("/") até ao fim de algum ramo (um ficheiro). Também vai ouvir pessoas a falar da árvore de directórios como se fosse uma árvore de família: assim os sub-directórios têm pais, e um caminho mostra a linhagem completa de de um ficheiro. Existem também caminhos relativos que começam algures noutro ponto diferente do directório raiz. Você deve lembrar-se que o directório "../" refere-se ao directório pai. Esta terminologia também se aplica a outras estruturas do tipo dos directórios, tais como estruturas de dados hierárquicos.

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

[Nota] Nota

Apesar de você 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 você deseja separar palavras num nome, as boas escolhas são o ponto, traço e underscore. Você também pode capitalizar cada palavra assim "ComoEsteExemplo". Os utilizadores de Linux com experiência procuram evitar espaços nos nomes de ficheiros.

[Nota] Nota

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

[Nota] Nota

A palavra caminho (path) é usada não apenas 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)). Você deve lembrar-se dos seguintes factos como princípio.

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

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

1.2.2. Internos do sistema de ficheiros

Seguindo 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 rijos e outros dispositivos de armazenamento, e a interacção com os dispositivos de hardware como ecrãs de consola e consolas série remotas são representados num modo unificado sob "/dev/".

Cada ficheiro, directório, pipe com nome (um modo de dois programas partilharem dados), ou dispositivo físico num sistema Debian GNU/Linux tem uma estrutura de dados chamada um 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. Se você está mesmo interessado, veja "/usr/include/linux/fs.h" para uma definição exacta de "inode de estrutura" no sistema Debian GNU/Linux. A ideia de representar praticamente tudo no sistema de ficheiros foi uma inovação do Unix, e os kernels modernos de Linux desenvolveram esta ideia ainda mais. Agora, até informação sobre os processos que correm no computador pode ser encontrada no sistema de ficheiros.

Esta representação abstracta e unificada de entidades físicas e processos internos é muito poderosa porque permite-nos usar o mesmo comando para o mesmo tipo de operação em muitos dispositivos 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] Dica

Se precisar de 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 afectados.

  • 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 acçõ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 directório, cada permissão correspondente permite as seguintes acções.

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

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

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

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

ls(1) é usado para mostrar informação de permissões (e mais) para ficheiros de directó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, consistindo de três caracteres cada para utilizador, grupo, e os outros por esta ordem)

  • Número de hard links para o ficheiro

  • Nome do utilizador que é 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 directório
l link simbólico
c nó de dispositivo de caractere
b nó de dispositivo de bloco
p pipe nomeado
s socket

chown(1) é usado a partir da conta de root para alterar o dono do ficheiro. chgrp(1) é usado 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 directório. A sintaxe básica para manipular o ficheiro foo é a seguinte.

# chown <novo_dono> foo
# chgrp <novo_grupo> foo
# chmod  [ugoa][+-=][rwxXst][,...] foo

Por exemplo, você pode fazer com que uma árvore de directórios tenha como dono o utilizador foo e seja partilhada pelo grupo bar com o seguinte.

# cd /qualquer/localização/
# chown -R foo:bar .
# chmod -R ug+rwX,o=rX .

Existem mais três bits de permissão especiais.

  • 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 directório activa o esquema de criação de ficheiros ao estilo BSD onde todos os ficheiros criados no directório pertencem ao grupo do directório.

Definir o sticky bit num directório previne que um ficheiro nesse directó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 directórios onde todos têm acesso de escrita, como o "/tmp" ou em directório 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 directó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 directório.

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

$ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4
crw------- 1 root root   108, 0 2007-04-29 07:00 /dev/ppp
-rw-r--r-- 1 root root     1427 2007-04-16 00:19 /etc/passwd
-rw-r----- 1 root shadow    943 2007-04-16 00:19 /etc/shadow
-rwsr-xr-x 1 root root   700056 2007-04-22 05:29 /usr/sbin/exim4
$ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src
drwxrwxrwt 10 root root  4096 2007-04-29 07:59 /tmp
drwxrwsr-x 10 root staff 4096 2007-03-24 18:48 /usr/local
drwxrwsr-x  4 root src   4096 2007-04-27 00:31 /usr/src
drwxrwsr-x  2 root mail  4096 2007-03-28 23:33 /var/mail
drwxrwxrwt  2 root root  4096 2007-04-29 07:11 /var/tmp

Existe um modo numérico alternativo para descrever as permissões do ficheiro com o chmod(1). Este modo numérico usa 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 ("-" sendo "0" e "rwx" sendo "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 17 2007-04-29 08:22 bar
-rw-r--r-- 1 penguin penguin 12 2007-04-29 08:22 foo
[Dica] Dica

Se você precisar aceder a informação mostrada por "ls -l" num script de shell, você deve usar comandos pertinentes como test(1), stat(1) e readlink(1). Os embutidos em shell como "[" ou "test" também podem ser usados.

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

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

 (permissões de ficheiros) = (permissões de ficheiros pedidas) & ~(valor umask)

Tabela 1.6. Exemplos do valor umask

umask permissões do ficheiro criadas permissões do directó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 seu próprio grupo privado. (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.)

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

De modo a fazer com que as permissões de um grupo sejam aplicadas a um determinado utilizador, esse utilizador precisa de se tornar um membro do grupo usando "sudo vigr".

[Nota] Nota

Alternativamente, você 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.)

Os dispositivos de hardware são apenas outro tipo de ficheiros no sistema Debian. Se tiver problemas a aceder a dispositivos como o CD-ROM e memórias USB a partir de uma conta de utilizador, você deve tornar esse utilizador um membro do grupo relevante.

Alguns grupos notáveis disponibilizados pelo sistema permitem aos seus membros aceder a ficheiros e dispositivos 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 dispositivos acessíveis
dialout acesso completo e directo 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 dispositivo de áudio
video dispositivo de vídeo
scanner scanner(s)
adm logs (relatórios) de monitorização do sistema
staff alguns directórios para trabalho administrativo júnior: "/usr/local", "/home"

[Dica] Dica

Você precisa 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/", você apenas precisa de pertencer ao grupo dip para criar uma ligação Dialup IP para esses peers de confiança usando 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 sudo sem a sua palavra-passe
lpadmin executa comandos para adicionar, modificar e remover impressoras das bases de dados de impressoras
plugdev executa pmount(1) para dispositivos amovíveis tal como as memórias USB

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.

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

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
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] Nota

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

  • Sobrescrever um ficheiro altera todos os atributos mtime, ctime, and 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 atime do ficheiro.

[Nota] Nota

Mesmo a simples leitura de um ficheiro no sistema Debian causa normalmente uma operação de escrita no ficheiro para actualizar a informação atime no inode. Montar um sistema de ficheiros com as opções "noatime" ou "relatime" faz com que o sistema salte esta operação e resulte num acesso mais rápido ao ficheiro para leitura. Isto é geralmente recomendado para portáteis, porque reduz a actividade do disco rijo e poupa energia. Veja mount(8).

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

Para marcas temporais, o comando ls gera diferentes strings sob o locale Inglês moderno ("en_US.UTF-8") a partir do antigo ("C").

$ LANG=en_US.UTF-8  ls -l foo
-rw-r--r-- 1 penguin penguin 3 2008-03-05 00:47 foo
$ LANG=C  ls -l foo
-rw-r--r-- 1 penguin penguin 3 Mar  5 00:47 foo
[Dica] Dica

Veja Secção 9.2.5, “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".

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

$ echo "Conteúdo Original" > foo
$ ls -li foo
2398521 -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:15 foo
$ ln foo bar     # hard link
$ ln -s foo baz  # symlink
$ ls -li foo bar baz
2398521 -rw-r--r-- 2 penguin penguin 17 2007-04-29 08:15 bar
2398538 lrwxrwxrwx 1 penguin penguin  3 2007-04-29 08:16 baz -> foo
2398521 -rw-r--r-- 2 penguin penguin 17 2007-04-29 08:15 foo
$ rm foo
$ echo "Novo Conteúdo" > foo
$ ls -li foo bar baz
2398521 -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:15 bar
2398538 lrwxrwxrwx 1 penguin penguin  3 2007-04-29 08:16 baz -> foo
2398540 -rw-r--r-- 1 penguin penguin 12 2007-04-29 08:17 foo
$ cat bar
Conteúdo Original
$ cat baz
Novo Conteúdo

O hardlink pode ser feito dentro do mesmo sistema de ficheiros e partilhar o mesmo número de inode que o ls(1) com a opção "-i" revela.

O link simbólico tem sempre permissões nominais de acesso ao ficheiro "rwxrwxrwx", como mostrado no exemplo em cima, com as permissões de acesso efectivas ditadas pelas permissões do ficheiro para o qual aponta.

[Cuidado] Cuidado

Geralmente é boa ideia não criar links simbólicos complicados ou hardlinks de todo a menos que tenha uma boa razão. Podem causar pesadelos onde a combinação lógica dos links simbólicos resulta em ciclos viciosos no sistema de ficheiros.

[Nota] Nota

Geralmente é preferível usar links simbólicos em vez de hard links, a menos que tenha boas razões para usar um hardlink.

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

Se você está a mover do Windows para Linux, em breve irá ficar claro o quão bem desenhado está a ligação de nomes de ficheiros em Unix está, comparada com o equivalente mais próximo em Windows de "atalhos". Porque está implementado no sistema de ficheiros, as aplicações não conseguem ver nenhuma diferença entre o link para um ficheiro e o original. No caso dos hardlinks, não há realmente nenhuma diferença.

1.2.8. Pipes nomeados (FIFOs)

Um pipe nomeado é um ficheiro que age como um pipe. Você coloca algo no ficheiro, e sai pelo outro lado. Assim é chamado um FIFO, ou Primeiro-a-Entrar-Primeiro-a-Sair: a primeira coisa que você coloca no pipe é a primeira coisa a sair pelo lado final.

Se você escrever para um pipe nomeado, o processo que escreve para o pipe não termina até que a informação que está a ser escrita para o pipe seja lida a partir do pipe. Se você ler a partir de um pipe nomeado, 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 o "|" 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 são uma inovação de muita influência do Unix.

Por exemplo, tente o seguinte

$ cd; mkfifo mypipe
$ echo "hello" >mypipe & # coloca nos bastidores
[1] 8022
$ ls -l mypipe
prw-r--r-- 1 penguin penguin 0 2007-04-29 08:25 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 ponto final 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] Dica

"netstat -an" disponibiliza uma visão geral muito útil dos sockets que estão abertos num determinado sistema.

1.2.10. Ficheiros de dispositivo

Os ficheiros de Dispositivos referem a dispositivos físicos ou virtuais no seu sistema, como o seu disco rijo, placa gráfica, monitor ou teclado. Um exemplo de dispositivo virtual é a consola, representada por "/dev/console".

Existem 2 tipos de ficheiros de dispositivo

  • Dispositivo de Caractere

    • Acedido a um caractere de cada vez

    • 1 caractere = 1 byte

    • Ex, teclado, porta série, ...

  • Dispositivo de Bloco

    • acedido em unidades maiores chamadas blocos

    • 1 bloco > 1 byte

    • Ex, o disco rijo, ...

Você pode ler e escrever nos ficheiros de dispositivo, 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, você pode despejar um ficheiro de texto para um dispositivo de impressora "/dev/lp0" ou enviar comandos de modem para a porta série apropriada "/dev/ttyS0". Mas, a menos que isto seja feito com cuidado, pode causar problemas maiores. Portanto seja cauteloso.

[Nota] Nota

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

Os números de nós de dispositivo são mostrados ao executar ls(1) como se segue.

$ ls -l /dev/hda /dev/ttyS0 /dev/zero
brw-rw---- 1 root cdrom   3,  0 2007-04-29 07:00 /dev/hda
crw-rw---- 1 root dialout 4, 64 2007-04-29 07:00 /dev/ttyS0
crw-rw-rw- 1 root root    1,  5 2007-04-29 07:00 /dev/zero
  • "/dev/hda" tem o maior número de dispositivo 3 e o menor número de dispositivo 0 . Isto é acessível para leitura e escrita pelo utilizador que pertence ao grupo cdrom.

  • "/dev/ttyS0" tem o maior número de dispositivo 4 e o menor número de dispositivo 64. Isto é acessível para leitura e escrita pelo utilizador que pertence ao grupo dialout.

  • "/dev/zero" tem o número 1 no maior dispositivo e o número 5 no menor dispositivo. Isto é acessível para leitura/escrita por todos.

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

1.2.11. Ficheiros de dispositivos especiais

Existem alguns ficheiros de dispositivos especiais.

Tabela 1.10. Lista de ficheiros de dispositivos especiais

ficheiro de dispositivo 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 gerador verdadeiro de números aleatórios, entregando 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 cheiro (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 do utilizador. Por outras palavras, estas entradas são virtuais, significando que elas agem como uma janela de conveniência às operações do sistema operativo.

O directório "/proc" contém (entre outras coisas) um sub-directório para cada processo em execução no sistema, o qual é nomeado pelo ID do processo (PID). Os utilitários do sistema que cedem a informação de processos, como o ps(1), obtêm a sua informação a partir desta estrutura de directórios.

Os directórios sob "/proc/sys/" contêm uma interface para alterar certos parâmetros do kernel durante o funcionamento. (Você pode fazer o mesmo através do comando especializado sysctl(8) ou do seu ficheiro de configuração pré-carregado "/etc/sysctrl.conf".)

[Nota] Nota

O kernel Linux pode queixar-se de "Demasiados ficheiros abertos". Você pode corrigir isto ao aumentar o valor "file-max" para uma valor maior a partir da shell de root, ex. "echo "65536" > /proc/sys/fs/file-max" (Isto era necessário em kernels antigos).

As pessoas entram em pânico frequentemente 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 depurar o kernel. É um ficheiro virtual que aponta para a memória do computador, portanto não se preocupe com o seu tamanho.

O directório sobre "/sys" contém estruturas de dados do kernel exportadas, os seus atributos, e as suas ligações entre eles. Também contém a interface 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-2.6.*/Documentation/filesystems/*") disponibilizados pelo pacote linux-doc-2.6.*.

1.3. Midnight Commander (MC)

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

Você deve precisar de instalar o pacote Midnight Commander que é intitulado de "mc" com o seguinte.

$ sudo apt-get install mc

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

  • "/etc" e os seus sub-directórios

  • e"/var/log" os seus sub-directórios

  • "/usr/share/doc" os seus sub-directórios

  • "/sbin" e "/bin"

1.3.1. Personalização do MC

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

. /usr/share/mc/bin/mc.sh

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

1.3.2. Arrancar o MC

O MC pode ser arrancado com o seguinte.

$ mc

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

[Nota] Nota

Em algumas consolas como o gnome-terminal(1), teclas de atalho de teclas de função podem ser roubadas pelo programa de consola. Você pode desactivar estas funcionalidades em "Editar" → "Atalhos do Teclado" para o gnome-terminal.

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

Se isto não limpar os seus problemas de écran com o MC, veja Secção 9.6.6, “A configuração do terminal”.

1.3.3. Gestor de ficheiros em MC

A predefinição é dois painéis de directórios que contêm listas de ficheiros. Outro modo útil é definir a janela direita para "informação" para ver informações de privilégios de acesso ao ficheiro, etc. Segue-se algumas teclas de atalho essenciais. Com o daemon gpm(8) em execução, também se pode usar o rato em consolas de caracteres do Linux. (Certifique-se que carrega na tecla shift para obter o comportamento normal de corte e colagem no MC.)

Tabela 1.11. As teclas de atalho do MC

tecla tecla de atalho
F1 menu de ajuda
F3 visualizador de ficheiros interno
F4 editor interno
F9 activa o menu de desenrolar
F10 sair do Midnight Commander
Tab mover entre duas janelas
Insert ou Ctrl-T marca o ficheiro para uma operação de múltiplos ficheiros como uma cópia
Del apaga 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 directório mostrado no ecrã seleccionado.

  • Ctrl-Enter ou Alt-Enter copia um nome de ficheiro para a linha de comandos, Use 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 directórios de inicio para ambas janelas como argumentos ao MC; por exemplo, "mc /etc /root".

  • Esc + n-keyFn (i.e., Esc + 1F1, etc.; Esc + 0F10)

  • 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 m esquema de cortar-e-colar interessante. Pressionar F3 marca o inicio da selecção, um segundo F3 marca o final da selecção e destaca a selecção. Depois você pode mover o cursos. Se pressionar F6, a área seleccionada é movida para a localização do cursor. Se pressionar F5, a área seleccionada é 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 usando um dos seguintes comandos.

$ mc -e ficheiro_a_editar
$ mcedit ficheiro_a_editar

Este não é um editor de múltiplas janelas, mas pode-se usar múltiplas consolas de Linux para s conseguir o mesmo efeito. Para copiar entre janelas, use as teclas Alt-F<n> para mudar entre consolas virtuais e use "Ficheiro→Inserir ficheiro" or "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.

E também, muitos programas usam as variáveis de ambiente "$EDITOR" ou "$VISUAL" para decidir que editor usar. Se você não está inicialmente confortável com o vim(1) ou o nano(1), você pode definir este para o "mcedit" ao adicionar as seguintes linhas ao "~/.bashrc".

export EDITOR=mcedit
export VISUAL=mcedit

Eu recomendo definir isto para "vim" se possível.

Se você fica desconfortável com o vim(1), você pode continuar a usar 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. Eu uso sempre isto para ficheiros no directório "/usr/share/doc". Esta é a maneira mais rápida de explorar 'por entre massas de informação de Linux. Este visualizador pode ser iniciado directamente usando um dos seguintes comandos.

$ mc -v caminho/para/nome_de_ficheiro_a_visualizar
$ mcview caminho/para/nome_de_ficheiro_a_visualizar

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.5.11, “Personalizar o programa a ser arrancado”). 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 seu conteúdo como sendo um sub-directório

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

1.3.8. Sistema de ficheiros FTP virtual no MC

O MC pode ser usado para aceder a ficheiros pela Internet usando FTP. Vá ao menu ao pressionar F9, depois escreva "p" para activar o sistema de ficheiros virtual FTP. Insira um URL no formato "nome-de-utilizador:palavra-passe@nome-de-máquina.nome-de-domínio", o que obtém um directório remoto que aparece como um local.

Tente "[http.us.debian.org/debian]" como URL e explore o arquivo Debian.

1.4. O ambiente de trabalho estilo Unix básico

Apesar do MC lhe permitir fazer quase tudo, é muito importante aprender a usar as ferramentas de linha de comandos invocadas do aviso de shell e torna-se familiarizado com o ambiente de trabalho estilo Unix.

1.4.1. A shell de login

Você pode seleccionar a sua shell de login com chsh(1).

Tabela 1.13. Lista de programas da shell

pacote popcon tamanho Shell do POSIX descrição
bash * V:90, I:99 3536 Sim Bash: a GNU Bourne Again SHell (o standard de facto)
tcsh * V:3, I:17 1308 Não Shell TENEX C: uma versão melhorada de Berkeley csh
dash * V:64, I:70 171 Sim Shell Alquimista do Debian. bom para script de shell
zsh * V:2, I:5 14164 Sim Z shell: a shell standard com muitos melhoramentos
pdksh * V:0.3, I:1.3 388 Sim versão de domínio público da Korn shell
csh * V:0.5, I:1.9 340 Não OpenBSD shell C, uma versão do Berkeley csh
sash * V:0.2, I:0.8 856 Sim Shell standalone com comandos embutidos (Não destinado para "/bin/sh" standard)
ksh * V:0.5, I:1.7 3092 Sim a versão AT&T real do Korn shell
rc * V:0.09, I:1.1 204 Não implementação do rc shell AT&T Plan 9
posh * V:0.01, I:0.09 228 Sim Policy-compliant Ordinary SHell (derivação da pdksh)

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

1.4.2. Personalizar o bash

Você pode personalizar o comportamento do bash(1) no "~/.bashrc".

por exemplo, tente o seguinte.

# CD ao MC existente
. /usr/share/mc/bin/mc.sh

# define CDPATH para uma correcta
CDPATH=.:/usr/share/doc:~:~/Desktop:~
export CDPATH

PATH="${PATH}":/usr/sbin:/sbin
# define PATH para incluir binários privados do utilizador, caso existam
if [ -d ~/bin ] ; then
  PATH=~/bin:"${PATH}"
fi
export PATH

EDITOR=vim
export EDITOR
[Dica] Dica

Você pode encontrar mais dicas de personalização da bash, como os Secção 9.2.7, “Comandos coloridos”, em Capítulo 9, Dicas do sistema.

1.4.3. Teclas especiais

No ambiente 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 da mão esquerda funcionam como se espera. Aqui estão algumas combinações de teclas notáveis para lembrar.

Tabela 1.14. Lista de teclas de atalho para bash

tecla descrição do atalho da tecla
Ctrl-U apaga a linha antes do cursor
Ctrl-H apaga 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 tarefa nos bastidores
Ctrl-S pára a saída para o écran
Ctrl-Q reactiva a saída para o écran
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 sob bash
Ctrl-R inicia o histórico de comandos incremental sob bash
Tab completa a entrada do nome de ficheiro para a linha de comandos sob bash
Ctrl-V Tab entrada Tab sem expansão para a linha de comandos sob bash

[Dica] Dica

A funcionalidade terminal de Ctrl-S pode ser desactivada usando stty(1).

1.4.4. Operações do rato ao estilo Unix

As operações do rato ao estilo Unix são baseadas em sistema de rato de 3 botões.

Tabela 1.15. Lista de operações de rato ao estilo Unix

acção resposta
Clique-esquerdo-e-arrastar do rato seleccionar e copiar para a área de transferência
Clique-esquerdo selecciona o início da selecção
Clique-direito selecciona o fim da selecção e copia para a área de transferência
Clique-central cola a área de transferência no cursor

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 usar o rato em consolas de caracteres de Linux, você precisa de ter o daemon gpm(8) a correr.

1.4.5. O pager

O less(1) é o paginador avançado (explorador de conteúdo de ficheiro). Carregue em "h" para ajuda. Ele 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/lessf/LESSOPEN". A opção "-R" permite saída em caracteres crus e activa sequências de escape de cores ANSI. Veja less(1).

1.4.6. O editor de texto

Você deve tornar-se conhecedor de uma das variantes do programa Vim ou no Emacs que são populares em sistemas tipo Unix.

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

Por sua vez você pode escolher o Emacs ou o XEmacs como o seu editor favorito, essa é realmente uma outra boa escolha, particularmente para programação. O Emacs tem também um leque de outras funcionalidades, incluindo funcionar como um leitor de news, editor de directório, programa de mail, etc. Quando é usado ara programação ou edição de scripts de shell, reconhece inteligentemente o formato daquilo em que você 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 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 que você aprenda a usá-los pela prática. Arranque o Vim ao escrever "vim" e carregue an tecla F1. Você 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] Nota

Os bons editores, como o Vim e o Emacs, podem ser usados para lidar com UTF-8 e outros textos com codificação exótica correctamente com a opção própria no emulador de terminal X em X sob locale UTF-8 com definições de tipo de letra apropriadas. Por favor consulte a sua documentação em texto multi-byte.

1.4.7. Definir um editor de texto predefinido

Debian vem com um número de editores diferentes. Nós recomendamos instalar o pacote vim, como mencionado em cima.

Debian disponibiliza acesso unificado ao editor predefinido do sistema via comando "/usr/bin/editor" para que outros programas (ex. reportbug(1)) possam invocá-lo. Você pode alterá-lo com o seguinte.

$ sudo update-alternatives --config editor

A escolha de "/usr/bin/vim.basic" sobre "/usr/bin/vim.tiny" é recomendação minha para novatos porque suporta destaque de sintaxe.

[Dica] Dica

Muitos programas usam as variáveis de ambiente "$EDITOR" ou "$VISUAL" para decidir qual editor usar (veja Secção 1.3.5, “O editor interno em MC” e Secção 9.5.11, “Personalizar o programa a ser arrancado”). Para consistência no sistema Debian, regule estas para "/usr/bin/editor". (Historicamente, "$EDITOR" era "ed" e "$VISUAL" era "vi".)

1.4.8. Personalizar o vim

Você pode personalizar o comportamento do vim(1) em "~/.vimrc".

Por exemplo, tente o seguinte

" -------------------------------
" Local configuration
"
set nocompatible
set nopaste
set pastetoggle=<f2>
syn on
if $USER == "root"
 set nomodeline
 set noswapfile
else
 set modeline
 set swapfile
endif
" filler to avoid the line above being recognized as a modeline
" filler
" filler

1.4.9. Gravar as actividades da shell

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

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

Por exemplo, tente o seguinte

$ script
Script iniciado, ficheiro é typescript

Faz quaisquer comandos de shell sob script.

Carregue em Ctrl-D para terminar o script.

$ vim typescript

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

1.4.10. Comandos Unix básicos

Vamos aprender comandos básicos do Unix. Aqui Eu uso "Unix" no seu sentido genérico. 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 se deseja por agora. Se for usado alias na shell, as saídas dos comandos correspondentes são diferentes. Estes exemplos não se destinam a ser executados por esta ordem.

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

Tabela 1.16. lista dos comandos Unix básicos

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

[Nota] Nota

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

[Nota] Nota

Para o comando cd, veja builtins(7).

[Nota] Nota

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 usando o comando "apt-get install less", o less(1) torna-se o paginador predefinido e você pode deslocar para trás com as teclas do cursor.

[Nota] Nota

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 atravesse os directórios e espreite no sistema usando os comandos em cima como treino. Se você tem 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

O estilo dos manuais pode ser um pouco difícil de se habituar a eles, porque são bastante concisos, particularmente os antigos muito tradicionais. Mas após se habituar a eles, vai apreciar a sua concisão.

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

$ <nome_do_comando> --help
$ <nome_do_comando> -h

1.5. O simples comando de shell

Agora você tem alguma sentido em como usar o sistema Debian. Vamos ver mais fundo no mecanismo da execução de comandos no sistema Debian. Aqui, Eu tenho simplificado a realidade para o novato. Veja bash(1) para a explicação exacta.

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 de comando e variável de ambiente

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

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

  • O gestor de ecrã como o gdm reinicia variáveis de ambiente

  • A shell nos seus códigos de arranque reinicia variáveis de ambiente em "~/bash_profile" e "~/.bashrc".

1.5.2. variável "$LANG"

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


Para códigos de linguagens e códigos de países, veja informação pertinente em "info gettext".

Para o conjunto de codificação no sistema Debian moderno, você deverá sempre defini-lo para UTF-8 a menos que queira especificamente usar o histórico tendo boas razões e conhecimentos para o fazer.

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

[Nota] Nota

O "LANG=en_US" não é "LANG=C" nem "LANG=en_US.UTF-8". É "LANG=en_US.ISO-8859-1" (veja Secção 8.3.1, “Bases de codificação”).

Tabela 1.18. Lista de recomendações de locale

recomendação de locale Linguagem (á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 uma sequência de linha de shell como o seguinte.

$ date
Sun Jun  3 10:27:39 JST 2007
$ LANG=fr_FR.UTF-8 date
dimanche 3 juin 2007, 10:27:33 (UTC+0900)

Aqui, o programa date(1) é executado com diferentes valores da variável de ambiente "$LANG".

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

  • Para o segundo comando, "$LANG" é definida para o 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 a preceder. Para o exemplo em cima, você pode executar alternativamente o seguinte.

$ LANG=fr_FR.UTF-8
$ date
dimanche 3 juin 2007, 10:27:33 (UTC+0900)

Como pode ver aqui, o resultado do comando é afectado pela variável de ambiente para produzir a saída em Francês. Se você deseja que a variável de ambiente seja hereditária aos sub-processos (ex. quando chama um script de shell), então você precisa de exportá-la com o seguinte.

$ export LANG
[Dica] Dica

Quando preencher um relatório de bug, é uma boa ideia correr e verificar o comando sob "LANG=en_US.UTF-8" se você usar um ambiente não Inglês.

Veja locale(5) e locale(7) for "$LANG" e variáveis de ambiente relacionadas.

[Nota] Nota

Eu recomendo-lhe configurar o ambiente do sistema apenas pela variável "$LANG" e não mexer em variáveis "$LC_*" a menos que seja absolutamente necessário.

1.5.3. variável "$PATH"

Quando você escreve um comando na shell, a shell procura o comando na lista de directó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 predefinida, a variável de ambiente "$PATH" das contas de utilizadores não deve incluir "/sbin" nem "/usr/sbin". Por exemplo, o comando ifconfig precisa de ser chamado com o caminho completo como "/sbin/ifconfig". (de modo semelhante, o comando ip está localizado em "/bin".)

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

1.5.4. variável "$HOME"

Muitos comandos armazenam configuração específica do utilizador no directório home e mudam os seus comportamentos pelo seu conteúdo. O directório home é identificado pela variável de ambiente "$HOME".

Tabela 1.19. 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] Dica

A shell expande "~/" para o directório home do utilizador actual, isto é, "$HOME/". A shell expande "~foo/" para o directório home de foo, isto é, "/home/foo/".

1.5.5. Opções de 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
Mon Oct 27 23:02:09 CET 2003
$ date -R
Mon, 27 Oct 2003 23:02:40 +0100

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

Muitas vezes você deseja que um comando funcione com um grupo de ficheiros sem ter que escrevê-los a todos. O padrão de expansão do nome de ficheiro usando a glob da shell , (por vezes referida como wildcards), facilitam esta necessidade.

Tabela 1.20. Padrões glob da shell

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

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] Nota

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

[Nota] Nota

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

1.5.7. Valor de retorno do comando

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

Tabela 1.21. 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] 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 precisa de ser lembrado aqui.

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

Vamos tentar lembrar os seguintes idiomas de comando de shell escritos em uma linha como parte de um comando de shell.

Tabela 1.22. Idiomas de comandos de shell

idioma do comando descrição
comando & execução nos bastidores 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 ambos saída standard e 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 redirecciona o error standard do comando para o 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 para o ficheiro foo
comando << delimitador redirecciona a entrada standard do comando para as seguintes linhas até que o "delimitador" seja atingido (aqui documento)
comando <<- delimitador redirecciona a entrada standard do comando para as 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 nos bastidores permitem aos utilizadores correr múltiplos programas numa única shell. A gestão dos processos nos bastidores envolve os embutidos da shell: jobs, fg, bg, e kill. Por favor leia as secções de bash(1) sob "SINAIS", e "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 usando o exec embutido com um descritor de ficheiro arbitrário

$ echo Hello >foo
$ exec 3<foo 4>bar  # abrir ficheiros
$ cat <&3 >&4       # redireccionar stdin para 3, stdout para 4
$ exec 3<&- 4>&-    # fechar ficheiros
$ cat bar
Hello

Aqui,"n<&-" e "n>&-" significam fechar o descritor de ficheiro "n".

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

Tabela 1.23. Descritores de ficheiro predefinido

dispositivo descrição descritor de ficheiro
stdin entrada standard 0
stdout saída standard 1
stderr erro standard 2

1.5.9. Comando alias

Você pode definir um nome alternativo (alias) para um comando frequentemente usado.

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.

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

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

Você 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".

1.6. Processamento de texto estilo Unix

Em ambientes de trabalho tipo Unix, o processamento de texto é feito ao canalizar texto por correntes 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.

  • Nenhuma expressão regular é usada:

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

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

    • cut(1) selecciona 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.

  • É usada uma expressão regular básica (BRE):

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

    • ed(1) é um editor de linhas primitivo.

    • sed(1) é um editor de fluxos.

    • vim(1) é um editor de écran.

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

  • É usada expressão regular extensa (ERE):

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

    • awk(1) faz processamento de texto simples.

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

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

    • pcregrep(1) do pacote pcregrep 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 você não ter a certeza do que estes comandos fazem, por favor use "man comando" para descobri-lo por si.

[Nota] Nota

A ordenação e alcance da expressão dependentes do locale. Se desejar obter o comportamento tradicional para um comando, use o locale C em vez dos UTF-8 ao preceder o comando com "LANG=C" (veja Secção 1.5.2, “variável "$LANG"” e Secção 8.3, “O locale”).

[Nota] Nota

As expressões regulares Perl (perlre(1)), Perl Compatible Regular Expressions (PCRE), e Python expressões regulares 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 usadas 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 padrão de correspondência e é feita de caracteres de texto e de meta-caracteres.

O meta-caractere é apenas um caractere com um significado especial. Existem 2 estilos principais, BRE e ERE, dependendo das ferramentas de texto como descrito em cima.

Tabela 1.24. Meta-caracteres para BRE e ERE

BRE ERE descrição da expressão regular
\ . [ ] ^ $ * \ . [ ] ^ $ * meta-caracteres comuns
\+ \? \( \) \{ \} \|   BRE apenas meta-caracteres 'escapados' "\"
  + ? ( ) { } | ERE apenas meta-caracteres não 'escapados' "\"
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 string
$ $ posição no fim de uma string
\< \< 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 usado para executar a pesquisa de texto usando a 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

1.6.3. Expressões de substituição

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

Tabela 1.25. 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 (sendo "n" um número)

Para string de substituição de Perl, é usado "$n" em vez de "\n" e "&" não tem nenhum significado especial.

Por exemplo, tente o seguinte

$ echo zzz1abc2efg3hij4 | \
sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/'
zzz=1abc2efg3hij4=
$ echo zzz1abc2efg3hij4 | \
sed -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
$ echo zzz1abc2efg3hij4 | \
perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=&=/'
zzz=&=

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

Estas expressões regulares também podem ser usadas 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 file 's/FROM_REGEX/TO_TEXT/g' | sponge file
[Dica] Dica

O comando sponge(8) é uma ferramenta Unix não standard oferecida pelo pacote moreutils. Isto é bastante útil quando deseja sobrescrever o ficheiro original.

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' '+w' '+q' ficheiro
[Dica] Dica

A bandeira "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/ge|update' '+q' ficheiro1 ficheiro2 ficheiro3
[Dica] 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;' ficheiro1 ficheiro2 ficheiro3

no exemplo perl(1), "-i" é para edição no-lugar, "-p" é para ciclo implícito sobre ficheiros.

[Dica] 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] 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 os seus dias 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

O awk é frequentemente usado 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 usadas para analisar este tipo de ficheiro.

Por exemplo, tente o seguinte

$ while read first last month year; do
    echo $month
  done <DPL
... os mesmos resultados que no primeiro exemplo do Awk

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

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

$ oldIFS="$IFS"   # guarda o valor antigo
$ 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"   # restaura o valor antigo

(Se o Awk é usado para fazer o equivalente, use "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 sua entrada.

$ IFS=":,"                        # usa ":" e "," como IFS
$ echo IFS=$IFS,   IFS="$IFS"     # echo é embutido no Bash
IFS=  , IFS=:,
$ date -R                         # apenas o resultado do comando
Sat, 23 Aug 2003 08:30:15 +0200
$ echo $(date -R)                 # sub shell --> entrada para a shell principal
Sat  23 Aug 2003 08 30 36 +0200
$ unset IFS                       # reset IFS para o predefinido
$ 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.26. 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 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 em uma linha
| tr -d '\r' remove CR
| sed 's/^/# /' adiciona "#" ao inicio de cada linha
| sed 's/\.ext//g' remove ".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 usando o find(1) e xargs(1) para executar tarefas bastante complicadas. Veja Secção 10.1.5, “Idiomas para a selecção de ficheiros” e Secção 9.5.9, “Repetindo um ciclo de comandos sobre ficheiros”.

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