Capítulo 1. Manuais de GNU/Linux

Índice

1.1. Básico da consola
1.1.1. A linha de comandos da 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. GUI 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 pacotes 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. Controlo de permissões para ficheiros acabados de criar: umask
1.2.5. Permissões para grupos de utilizadores (group)
1.2.6. Marcas temporais (Timetamps)
1.2.7. Links (ligações)
1.2.8. Pipes com nome (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.2.13. tmpfs
1.3. Midnight Commander (MC)
1.3.1. Personalização do MC
1.3.2. Iniciar o MC
1.3.3. Gestor de ficheiros no 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 virtual FTP no MC
1.4. O ambiente de trabalho estilo Unix básico
1.4.1. A shell de login
1.4.2. Personalizar 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 básicos de Unix
1.5. O comando simples da shell
1.5.1. Execução do 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 da 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 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. Você 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] Nota

Se você tem usado qualquer sistema de tipo Unix 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. Básico da consola

1.1.1. A linha de comandos da shell

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

foo login:

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

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] 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 é 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 lenny/sid foo tty1
foo login: penguin
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".

Você está agora 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 gdm3 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. Escreva 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 a palavra-passe ou utilize o rato e o clique principal.

Você pode obter uma linha de comandos no X ao iniciar um programa x-terminal-emulator tal como o gnome-terminal(1), rxvt(1) ou o xterm(1). No ambiente de trabalho GNOME, clicar em "Aplicações" → "Acessórios" → "Consola".

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

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 centro do ecrã 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, você pode executar as seguintes tarefas de administração do sistema:

  • Ler, escrever e remover quaisquer ficheiros no sistema independentemente das suas permissões

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

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

  • Fazer login em qualquer conta sem a sua palavra-passe

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

[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. 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 sua resolução 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 ganhar a prompt da shell de root ao utilizar a palavra-passe do root:

  • Escreva root na prompt de login baseada em caracteres.

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

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

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

  • Escreva "su" na prompt de shell de qualquer utilizador.

    • Isto preserva algum do ambiente do utilizador actual.

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

Quando o menu do seu ambiente de trabalho não iniciar automaticamente as ferramentas GUI de administração do sistema com os privilégios apropriados, você pode iniciá-las a partir da prompt da shell de root do emulador dum terminal X, tal como o 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 com a conta root ao escrever root na prompt do gestor de ecrã/sessão como o gdm3(1).

[Atenção] Atenção

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 que você esteja num ambiente GUI, você pode mudar entre consolas virtuais ao pressionar Left-Alt-key e simultaneamente numa das teclas F1F6. Cada consola de caracteres permite um login independente para a conta e oferece um ambiente multi-utilizador. Este ambiente multi-utilizador é uma funcionalidade excelente do Unix, e muito viciante.

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

Você pode, em alternativa, 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

Escreva Ctrl-D, isto é, a tecla-Ctrl-esquerda e a tecla d pressionadas ao mesmo tempo, na linha de comandos para fechar a actividade da shell. Se estiver na consola de caracteres, com isto, você retorna ao aviso de login. 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. 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 colocar 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, 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

Em alternativa, você pode pressionar Ctrl-Alt-Delete (A tecla-Ctrl-esquerda, a tecla-Alt-esquerda, e Delete pressionadas ao mesmo tempo) para desligar o sistema se "/etc/inittab" contiver "ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now". Veja inittab(5) para detalhes.

Veja a Secção 6.9.6, “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 <algum-ficheiro-binário>", escreva "reset" na linha de comandos. Você 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, com o seguinte:

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

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:97, I:260 1300 Um gestor de ficheiro de ecrã completo em modo de texto
sudo V:438, I:740 1844 Um programa para permitir privilégios de root limitados aos utilizadores
vim V:167, I:399 1877 O editor de texto de Unix Vi IMproved, um editor de texto para programadores (versão standard)
vim-tiny V:119, I:949 830 O editor de texto de Unix Vi IMproved, um editor de texto para programadores (versão compacta)
emacs23 V:49, I:98 13035 Emacs do Projecto GNU, o editor de texto extensível baseado em Lisp (versão 23)
w3m V:267, I:870 2082 Navegadores de WWW de modo de texto
gpm V:23, I:36 499 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:848 142 Documentação do Projecto Debian, (FAQ do Debian) e outros documentos
debian-policy I:80 3648 Manual de Políticas Debian e documentos relacionados
developers-reference I:7 1046 Guias e informação para programadores de Debian
maint-guide I:4 699 Guia dos Novos Maintainers de Debian
debian-history I:2 4306 História do Projecto Debian
debian-faq I:797 1151 FAQ do Debian
sysadmin-guide I: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 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 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

Em alternativa, é 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 qual você administre e onde você é o único utilizador.

[Atenção] 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] 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.

[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 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 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 deveriam 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 numa 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. mount(8) serve para anexar o sistema de ficheiros encontrado num dispositivo à 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 "/share/doc/linux-doc-2.6.*/Documentation/filesystems/".

Os directó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 directório raiz significa a raiz do sistema de ficheiros e é referido 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 percorridos para o alcançar. Estes 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 do ficheiro. O primeiro "/" é o directório de nível de topo, e os outros "/"' separam sucessivamente os sub-directó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 directório raiz tem algumas ramificações, 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/". O todo, visto em conjunto, é a chamada árvore de directórios. Você 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 directórios como se fosse uma árvore de família juntando todos os descendentes directos numa única figura chamada de directório raiz ("/"): assim, os sub-directó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 directório raiz. Deve lembrar-se que o directório "../" refere-se ao directório pai. Esta terminologia também se aplica a outras estruturas semelhantes a directórios, como estruturas hierárquicas de dados.

  • Não existe componente especial no nome de caminho que corresponde a um dispositivos 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 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 avançados de Linux 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 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)). 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 rigídos 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, 'named pipe' (um modo de dois programas partilharem dados), ou dispositivo 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. Se você estiver mesmo interessado, veja "/usr/include/linux/fs.h" para uma definição exacta de "struct inode" no sistema Debian GNU/Linux. 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. Actualmente, 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 utilizar 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 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 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 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) é utilizado para mostrar informação de permissões (e mais) para ficheiros e 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 em três caracteres cada para utilizador, grupo, e outros por esta ordem)

  • Número de hard links para o 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 directório
l link simbólico
c nó de dispositivo de caractere
b nó de dispositivo 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 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 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 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ó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 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------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 ("-" 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 0 Oct 16 21:39 bar
-rw-r--r-- 1 penguin penguin 0 Oct 16 21:35 foo
[Dica] Dica

Se necessitar aceder a informação mostrada por "ls -l" num script da shell, você 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 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.)

[Dica] Dica

Active UPG ao colocar "umask 002" no ficheiro ~/.bashrc.

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

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

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ê 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/", você apenas precisa de pertencer ao grupo dip para criar uma ligação Dialup IP para esses peers de confiança utilizando 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 executar sudo sem a sua palavra-passe
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 (Timetamps)

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, 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 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 rígido e poupa energia. Veja mount(8).

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

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

$ LANG=pt_PT.UTF-8  ls -l foo
-rw-rw-r-- 1 penguin penguin 0 oct. 16 21:35 foo
$ LANG=C  ls -l foo
-rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 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.

$ umask 002
$ echo "Conteúdo Original" > 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 "Novo Conteúdo" > 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
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 tal como o ls(1) com a opção "-i" revela.

O link simbólico 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] Cuidado

Geralmente é boa ideia, de todo, não criar links simbólicos complicados ou hardlinks 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 utilizar 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 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, 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 com nome (FIFOs)

Um pipe com nome é um ficheiro que age como um pipe. Você 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 você coloca no pipe é a primeira coisa a sair pelo outro lado.

Se você escrever para um pipe com nome, 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 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 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 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] Dica

"netstat -an" dá 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-se a dispositivos físicos ou virtuais no seu sistema, como o seu disco rígido, placa gráfica, monitor ou teclado. Um exemplo de dispositivo virtual é a consola, que é representada por "/dev/console".

Existem 2 tipos de ficheiros de dispositivo

  • Dispositivo de Caractere

    • Acedido por 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 rígido, ...

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/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 dispositivo 8 e o número menor de dispositivo 0. Isto é acessível para leitura e escrita ao utilizador que pertencer ao grupo disk.

  • "/dev/sr0" tem o número maior de dispositivo 11 e o número menor de dispositivo 0. Isto é acessível para leitura e escrita ao utilizador que pertencer ao grupo cdrom.

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

  • "/dev/zero" tem o número 1 no dispositivo maior e o número 5 no número de dispositivo 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 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 verdadeiro gerador 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 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, 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 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 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é-carregamento "/etc/sysctrl.conf".)

[Nota] Nota

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

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 para a memória do computador, portanto não se preocupe com o seu tamanho.

O directó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 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.2.13. tmpfs

Otmpfs é 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 da memória pode ser ir para o espaço swap no disco, conforme necessário.

O directório "/run" é montado como tmpfs no inicio do processo de arranque. Isto habilita a escrita mesmo que o directório "/ esteja montado como apenas-leitura. Esta é a nova localização para o armazenamento de ficheiros de estado transientes 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 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/lib/mc/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. Iniciar o MC

O MC pode ser iniciado 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), as funções das teclas 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 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.6.6, “A configuração do terminal”.

1.3.3. Gestor de ficheiros no MC

O predefinido são dois painéis de directó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 activar 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 directório mostrado no ecrã seleccionado.

  • 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 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 um 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 cursor. 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 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-F<n> 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 você não está confortável com o vim(1) ou com o nano(1), você pode definir para o "mcedit" adicionando as seguintes linhas ao "~/.bashrc".

export EDITOR=mcedit
export VISUAL=mcedit

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

Se você 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. Eu uso sempre isto para ficheiros no directório "/usr/share/doc". Esta é a maneira mais rápida para navegar por entre grandes quantidadede 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 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 seu conteúdo como sendo um sub-directó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 seu estado com o chmod(1) ou via menu ficheiro do MC.

1.3.8. Sistema de ficheiros virtual FTP no MC

O MC pode ser utilizado para aceder a ficheiros pela Internet usando FTP. Vá ao menu pressionando F9, e 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 se fosse 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 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

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:901, I:999 3941 Sim Bash: a GNU Bourne Again SHell (o standard de facto)
tcsh V:30, I:124 1378 Não Shell TENEX C: uma versão melhorada de Berkeley csh
dash V:789, I:841 212 Sim Shell Almquist, bom para scripts da shell
zsh V:31, I:63 11462 Sim Z shell: a shell standard com muitas melhorias
pdksh V:1, I:13 41 Sim versão de domínio público da Korn shell
csh V:5, I:18 340 Não OpenBSD shell C, uma versão do Berkeley csh
sash V:2, I:8 946 Sim shell Stand-alone com comandos embutidos (Não se destina a "/bin/sh" standard)
ksh V:5, I:20 3128 Sim a real, versão AT&T da Korn shell
rc V:0, I:10 169 Não implementação da rc shell sw AT&T Plan 9
posh V:0, I:0 201 Sim Policy-compliant Ordinary SHell (deriva da pdksh)

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

1.4.2. Personalizar bash

Você pode personalizar o comportamento da bash(1) em "~/.bashrc".

Por exemplo, tente o seguinte.

# CD ao sair do MC
. /usr/lib/mc/mc.sh

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

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

EDITOR=vim
export EDITOR
[Dica] Dica

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 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 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 para o 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] Dica

A funcionalidade do 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 num 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ê necessita ter o daemon gpm(8) a correr.

1.4.5. O pager

O less(1) é o paginador avançado (navegador de conteúdo de ficheiros). Carregue em "h" para ajuda. 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 em bruto 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 dos programas Vim ou 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. (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 é bastante semelhante e mais poderoso já que lhe oferece ajuda através da tecla F1 .)

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 para programação ou edição de scripts de shell, é inteligente para reconhecer 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-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 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 utilizados para lidar correctamente com UTF-8 e outros textos com codificações exóticas, com a opção própria no x-terminal-emulator em X com o locale UTF-8 e com definições de tipo de letra apropriadas. Por favor consulte a sua documentação acerca de 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 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. Você 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] 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.5.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. 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 na shell pode sair fora do seu ecrã e ficar perdido para sempre. É 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 básicos de Unix

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 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.16. lista dos comandos Unix básicos

comando descrição
pwd mostrar o nome do directório actual
whoami mostrar o nome do utilizador actual
id mostrar a identidade do utilizador actual (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 directório (ficheiros e directórios não escondidos)
ls -a listar o conteúdo do directório (todos os ficheiros e directórios)
ls -A listar o conteúdo do directório (quase todos os ficheiros e directórios, isto é, salta o ".." e ".")
ls -la listar todo o conteúdo do directório com informação detalhada
ls -lai listar todo o conteúdo do directório com número de inode e informação detalhada
ls -d listar todos os directórios sob o directório actual
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 directório "<foo>" no directório actual
rmdir <foo> remover um directório "<foo>" no directório actual
cd <foo> mudar o directório para o directório "<foo>" no directório actual ou no directório listado na variável "$CDPATH"
cd / mudar o directório para o directório raiz
cd mudar para o directório home do utilizador actual
cd /<foo> mudar para o directório de caminho absoluto "/<foo>"
cd .. mudar para o directório pai
cd ~<foo> mudar para o directório home do utilizador "<foo>"
cd - mudar para o directório anterior
</etc/motd pager mostrar o conteúdo de "/etc/motd" utilizando 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 directó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 directório "<bar>" tem de existir mas o directó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 <padrão> procurar nomes de ficheiros correspondentes usando um "<padrão>" de shell (lento)
locate -d . <padrão> procurar 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 procurar um "<padrão>" em todos os ficheiros terminados com ".html" no directório actual e mostra-os todos
top mostrar informação de processos usando ecrã completo, carregue em "q" para sair
ps aux | pager mostrar informação dos processos a correr usando saída ao estilo BSD
ps -ef | pager mostrar informação dos processos a correr usando 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 ACSII
kill <1234> matar todos os processos identificados pelo ID de processo: "<1234>"
gzip <foo> comprimir "<foo>" para criar "<foo>.gz" usando a codificação Lempel-Ziv (LZ77)
gunzip <foo>.gz descomprimir "<foo>.gz" para criar "<foo>"
bzip2 <foo> comprimir "<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 descomprimir "<foo>.bz2" para criar "<foo>"
xz <foo> comprimir "<foo>" para criar "<foo>.xz" usando 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 usando 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] 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.

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

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

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

1.5. O comando simples da shell

Agora você 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, eu simplifiiquei 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 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 gestor de ecrã como o gdm3 redefine variáveis de ambiente

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

1.5.2. Variável "$LANG"

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


Para códigos de idioma e códigos de países, veja a 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 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.

$ 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 precedentes. Para o exemplo acima, você pode executar em alternativa 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 desejar que a variável de ambiente seja hereditária aos sub-processos (p.e. quando chama um script de shell), então necessita de exportá-la com o seguinte.

$ export LANG
[Dica] Dica

Se utilizar um ambiente que não seja em Inglês quando preencher um relatório de bug, é uma boa ideia correr e verificar o comando com "LANG=en_US.UTF-8"

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

[Nota] Nota

Eu recomendo 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, por omissão, a variável de ambiente "$PATH" das contas de utilizadores pode não incluir "/sbin" nem "/usr/sbin". Por exemplo, o comando ifconfig necessita ser chamado com o caminho completo como "/sbin/ifconfig". (De modo idêntico, o comando ip está localizado em "/bin".)

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, do utilizador, e mudam o seu comportamento de acordo com o seu conteúdo. O directório de utilizador é 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 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
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

Frequentemente deseja trabalhar com um conjunto de ficheiros sem os digitar a todos. O padrão de expansão do nome de ficheiro utilizando a glob da shell , (por vezes referida como wildcards), facilita 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 por "."
.* nome de ficheiro (segmento) iniciado por "."
? 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 POSIX)

[Nota] Nota

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 necessita 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 numa linha como parte de um comando de shell.

Tabela 1.22. 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 redirecciona o erro 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 (documentar aqui)
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 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 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

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

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

  • É utilizada 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 streams.

    • vim(1) é um editor de ecrã.

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

  • É utilizada uma 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 tiver a certeza do que estes comandos fazem, por favor utilize "man comando" para descobri-lo por si.

[Nota] Nota

A ordenação e alcance da expressão dependem 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 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 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 conforme descrito acima.

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

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, é utilizado "$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 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 -ie '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' '+w' '+q' ficheiro
[Dica] 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/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 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
... 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" facilmente com a shell.

$ 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 for utilizado para fazer o equivalente, utilizee "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”).