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. The shell prompt under GUI
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 (Timestamps)
1.2.7. Links (ligações)
1.2.8. Pipes com nome (FIFOs)
1.2.9. Sockets
1.2.10. Ficheiros de aparelho
1.2.11. Ficheiros de aparelhos 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. Virtual filesystem of 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. Mouse operations
1.4.5. O pager
1.4.6. O editor de texto
1.4.7. Definir um editor de texto predefinido
1.4.8. Using vim
1.4.9. Gravar as atividades 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. A variável "$LANG"
1.5.3. A variável "$PATH"
1.5.4. A 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

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

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

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

[Nota] Nota

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

Upon starting the system, you are presented with the character based login screen if you did not install any GUI environment such as GNOME or KDE desktop system. Suppose your hostname is foo, the login prompt looks as follows.

If you installed a GUI environment, then you can still get to the character based login prompt by Ctrl-Alt-F3, and you can return to the GUI environment via Ctrl-Alt-F2 (see Secção 1.1.6, “Consolas virtuais” below for more).

foo login:

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

[Nota] Nota

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

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

Debian GNU/Linux 12 foo tty3

foo login: penguin
Password:

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

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

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

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

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

If you installed a GUI environment during the installation, you are presented with the graphical login screen upon starting your system. You type your username and your password to login to the non-privileged user account. Use tab to navigate between username and password, or use the primary click of the mouse.

You can gain the shell prompt under GUI environment by starting a x-terminal-emulator program such as gnome-terminal(1), rxvt(1) or xterm(1). Under the GNOME desktop environment, press SUPER-key (Windows-key) and typing in "terminal" to the search prompt does the trick.

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

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

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

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

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

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

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

[Atenção] Atenção

Nunca partilhe a palavra-passe de root com outros.

[Nota] Nota

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

When your desktop menu does not start GUI system administration tools automatically with the appropriate privilege, you can start them from the root shell prompt of the terminal emulator, such as gnome-terminal(1), rxvt(1), or xterm(1). See Secção 1.1.4, “A linha de comandos shell do root” and Secção 7.9, “X server connection”.

[Atenção] Atenção

Never start the GUI display/session manager under the root account by typing in root to the prompt of the display manager such as gdm3(1).

Nunca execute programas GUI remotos que não sejam confiáveis no X Window quando é mostrada informação critica porque pode "espiar" o seu ecrã X.

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

If you are in the GUI environment, you gain access to the character console 3 by pressing Ctrl-Alt-F3 key, i.e., the left-Ctrl-key, the left-Alt-key, and the F3-key are pressed together. You can get back to the GUI environment, normally running on the virtual console 2, by pressing Alt-F2.

You can alternatively change to another virtual console, e.g. to the console 3, from the commandline.

# chvt 3

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

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

# shutdown -h now

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

# poweroff -i -f

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

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

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

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


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


Pode instalar alguns destes pacotes com o seguinte.

# apt-get install package_name

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

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

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

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

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

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

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 aparelhos limitados e ficheiros limitados, deve considerar usar o group para disponibilizar acesso limitado em vez de usar os privilégios do root via sudo(8).

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

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

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

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

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

[Nota] Nota

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

[Nota] Nota

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

[Nota] Nota

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

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


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

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

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

[Dica] Dica

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

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

  • O utilizador que é dono do ficheiro (u)

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

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

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

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

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

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

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

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

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

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

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

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

  • Tipo de ficheiro (primeiro caractere)

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

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

  • Nome do utilizador dono do ficheiro

  • Nome do grupo ao qual o ficheiro pertence

  • Tamanho do ficheiro em caracteres (bytes)

  • Data e hora do ficheiro (mtime)

  • Nome do ficheiro


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Por exemplo, tente o seguinte:

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

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

[Atenção] Atenção

Please make sure to save unsaved changes before doing reboot or similar actions.

You can add a user penguin to a group bird in two steps:

  • Change group configuration using one of following:

    • Execute "sudo usermod -aG bird penguin".

    • Execute "sudo adduser penguin bird". (only on typical Debian systems)

    • Execute "sudo vigr" for /etc/group and "sudo vigr -s" for /etc/gshadow to append penguin in the line for bird.

  • Apply configuration using one of following:

    • Cold reboot and login. (Best option)

    • Execute "kill -TERM -1" and do some fix-up actions such as "systemctl restart NetworkManager.service".

    • Logout via GUI menu and login.

You can remove a user penguin from a group bird in two steps:

  • Change group configuration using one of following:

    • Execute "sudo usermod -rG bird penguin".

    • Execute "sudo deluser penguin bird". (only on typical Debian systems)

    • Execute "sudo vigr" for /etc/group and "sudo vigr -s" for /etc/gshadow to remove penguin in the line for bird.

  • Apply configuration using one of following:

    • Cold reboot and login. (Best option)

    • Execute "kill -TERM -1" and do some fix-up actions such as "systemctl restart NetworkManager.service".

    • Logout via GUI menu is not an option for Gnome Desktop.

Any warm reboot attempts are fragile replacements of the real cold reboot under the modern desktop system.

[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, Authentication and access controls.)

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

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


[Dica] Dica

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

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


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

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


[Nota] Nota

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

[Nota] Nota

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

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

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

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

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

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

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

[Nota] Nota

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

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

For timestamps, the ls command outputs localized strings under non-English locale ("fr_FR.UTF-8").

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

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

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 da ligação e as diferenças subtis nos resultados do comando rm.

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

The hardlink can be made within the same filesystem and shares the same inode number which the "-i" option with ls(1) reveals.

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

[Cuidado] Cuidado

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

[Nota] Nota

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

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

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

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

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

Por exemplo, tente o seguinte:

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

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

Existem 2 tipos de ficheiros de aparelho.

  • Aparelho de Caractere

    • Acedido por um caractere de cada vez

    • 1 caractere = 1 byte

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

  • Aparelho de Bloco

    • acedido em unidades maiores chamadas blocos

    • 1 bloco > 1 byte

    • Por exemplo, o disco rígido, …

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

[Nota] Nota

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

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

$ ls -l /dev/sda /dev/sr0 /dev/ttyS0 /dev/zero
brw-rw---T  1 root disk     8,  0 Oct 16 20:57 /dev/sda
brw-rw---T+ 1 root cdrom   11,  0 Oct 16 21:53 /dev/sr0
crw-rw---T  1 root dialout  4, 64 Oct 16 20:57 /dev/ttyS0
crw-rw-rw-  1 root root     1,  5 Oct 16 20:57 /dev/zero
  • "/dev/sda" tem o número maior de aparelho 8 e o número menor de aparelho 0. Isto é acessível para leitura e escrita aos utilizadores que pertencem ao grupo disk.

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

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

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

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

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

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

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

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

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

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

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

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

  • "/var/run" → "/run"

  • "/var/lock" → "/run/lock"

  • "/dev/shm" → "/run/shm"

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

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

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

$ sudo apt-get install mc

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

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

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

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

  • "/usr/sbin" e "/usr/bin"

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

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

$ mc -e filename_to_edit
$ mcedit filename_to_edit

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

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

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

export EDITOR=mcedit
export VISUAL=mcedit

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

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

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.

Since the login shell may be used by some system initialization programs, it is prudent to keep it as bash(1) and avoid switching the login shell with chsh(1).

If you want to use a different interactive shell prompt, set it from GUI terminal emulator configuration or start it from ~/.bashrc, e.g., by placing "exec /usr/bin/zsh -i -l" or "exec /usr/bin/fish -i -l" in it.


[Dica] Dica

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

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

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

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

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

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

[Nota] Nota

Good editors, such as Vim and Emacs, can handle UTF-8 and other exotic encoding texts correctly. It is a good idea to use the GUI environment in the UTF-8 locale and to install required programs and fonts to it. Editors have options to set the file encoding independent of the GUI environment. Please refer to their documentation on multibyte text.

The recent vim(1) starts itself in the sane "nocompatible" option and enters into the NORMAL mode.[1]


Please use the "vimtutor" program to learn vim through an interactive tutorial course.

The vim program changes its behavior to typed key strokes based on mode. Typing in key strokes to the buffer is mostly done in INSERT-mode and REPLACE-mode. Moving cursor is mostly done in NORMAL-mode. Interactive selection is done in VISUAL-mode. Typing ":" in NORMAL-mode changes its mode to Ex-mode. Ex-mode accepts commands.

[Dica] Dica

The Vim comes with the Netrw package. Netrw supports reading files, writing files, browsing directories over a network, and local browsing! Try Netrw with "vim ." (a period as the argument) and read its manual at ":help netrw".

For the advanced configuration of vim, see Secção 9.2, “Personalizar o vim”.

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

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

Tabela 1.17. lista dos comandos Unix básicos

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

[Nota] Nota

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

Para o comando cd, veja builtins(7).

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

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

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

Por exemplo, tente o seguinte:

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

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

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

$ commandname --help
$ commandname -h

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

Um comando simples é uma sequência de componentes.

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

  2. Nome do comando

  3. Argumentos (opcional)

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

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

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.

  • The PAM system such as pam_env may set environment variables by /etc/pam.conf", "/etc/environment" and "/etc/default/locale".

  • The display manager such as gdm3 may reset environment variables for GUI session by "~/.profile".

  • The user specific program initialization may reset environment variables by "~/.profile", "~/.bash_profile" and "~/.bashrc".

The default locale is defined in the "$LANG" environment variable and is configured as "LANG=xx_YY.UTF-8" by the installer or by the subsequent GUI configuration, e.g., "Settings" → "Region & Language" → "Language" / "Formats" for GNOME.

[Nota] Nota

I recommend you to configure the system environment just by the "$LANG" variable for now and to stay away from "$LC_*" variables unless it is absolutely needed.

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



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

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

Here, the program date(1) is executed with different locale values.

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

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

When filing a bug report, running and checking the command under "en_US.UTF-8" locale is a good idea if you use non-English environment.

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

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

Tabela 1.23. Idiomas de comandos de shell

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

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

Por exemplo, tente o seguinte:

$ </etc/motd pager
$ pager </etc/motd
$ pager /etc/motd
$ cat /etc/motd | pager

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

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

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

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


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.

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

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

[Nota] Nota

Sort order and range expression are locale dependent. If you wish to obtain traditional behavior for a command, use C locale or C.UTF-8 locale instead of normal UTF-8 ones (see Secção 8.1, “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.

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

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

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


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

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


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

Por exemplo, tente o seguinte:

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

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

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

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

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

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

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

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

Por exemplo, tente o seguinte:

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

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

Por exemplo, tente o seguinte:

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

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

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

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

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

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

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

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

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


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

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



[1] Even the older vim can starts in the sane "nocompatible" mode by starting it with the "-N" option.