systemdjournalctl: consultar o diário do systemdudevAtualmente, muitas pessoas usam computadores com uma GUI (interface gráfica do usuário) como o GNOME. Embora ela ofereça muitos recursos, seu uso é limitado quando se trata de execução de tarefas automatizadas. Shells são bons aliados das interfaces gráficas, por isso este capítulo apresenta uma visão geral de alguns aspectos dos shells, neste caso, o Bash.
Tradicionalmente, o shell é o Bash (Bourne again Shell). Quando este capítulo menciona “o shell”, ele se refere ao Bash. Na verdade, há mais shells disponíveis além do Bash (ash, csh, ksh, zsh, etc.), cada um deles empregando recursos e características diferentes. Se você precisar de mais informações sobre outros shells, pesquise por shell no YaST.
Um shell pode ser acionado como:
Shell de login interativo.
Esse tipo é usado para efetuar login em uma máquina, chamando o Bash com a opção --login, ou para efetuar login em uma máquina remota com SSH.
Shell interativo “comum”. Normalmente esse é o caso quando se inicia o xterm, o konsole, o gnome-terminal ou ferramentas semelhantes.
Shell não interativo. Usado para chamar um script de shell na linha de comando.
Dependendo do tipo de shell usado, variam os arquivos de configuração lidos. As tabelas seguintes mostram os arquivos de configuração de shell de login e sem login.
|
Arquivo |
Descrição |
|---|---|
|
|
Não modifique esse arquivo, senão as suas modificações poderão ser destruídas durante a próxima atualização! |
|
|
Use esse arquivos se for estender |
|
|
Contém arquivos de configuração de programas específicos para todo o sistema |
|
|
Insira aqui a configuração específica de usuário para os shells de login |
|
|
Não modifique esse arquivo, senão as suas modificações poderão ser destruídas durante a próxima atualização! |
|
|
Use esse arquivo para inserir suas modificações apenas do Bash em todo o sistema |
|
|
Insira aqui a configuração específica de usuário |
Além desses, o Bash usa mais outros arquivos:
|
Arquivo |
Descrição |
|---|---|
|
|
Contém uma lista de todos os comandos que você digitou |
|
|
Executado durante o logout |
A tabela a seguir fornece uma breve visão geral dos mais importantes diretórios de nível superior encontrados em um sistema Linux. Informações mais detalhadas sobre os diretórios e subdiretórios importantes são encontradas na lista a seguir.
|
Diretório |
Conteúdo |
|---|---|
|
Diretório raiz: o ponto de partida da árvore do diretório. | |
|
Arquivos binários essenciais, como comandos necessários pelo administrador do sistema e por usuários comuns. Geralmente contém os shells, como o Bash. | |
|
Arquivos estáticos do carregador de boot. | |
|
Arquivos necessários para acessar dispositivos específicos de host. | |
|
Arquivos de configuração do sistema específicos de host. | |
|
Contém os diretórios pessoais de todos os usuários que possuem conta no sistema. Porém, o diretório pessoal do | |
|
Bibliotecas compartilhadas e módulos de kernel essenciais. | |
|
Pontos de montagem de mídia removível. | |
|
Ponto de montagem para montar temporariamente um sistema de arquivos. | |
|
Pacotes de aplicativos complementares. | |
|
Diretório pessoal do superusuário | |
|
Binários essenciais do sistema. | |
|
Dados de serviços fornecidos pelo sistema. | |
|
Arquivos temporários. | |
|
Hierarquia secundária com dados apenas leitura. | |
|
Dados variáveis, como arquivos de registro. | |
|
Disponível apenas se você tiver o Microsoft Windows* e o Linux instalados no sistema. Contém os dados do Windows. |
A lista a seguir fornece informações mais detalhadas e alguns exemplos de arquivos e subdiretórios encontrados nos diretórios:
/bin
Contém comandos básicos do shell que podem ser usados pelo root e por outros usuários. Esses comandos incluem ls, mkdir, cp, mv, rm e rmdir. O /bin também contém o Bash, o shell padrão do SUSE Linux Enterprise Desktop.
/boot
Contém dados necessários para inicializar, como o carregador de boot, o kernel e outros dados usados para que o kernel possa executar programas em modo de usuário.
/dev
Contém arquivos de dispositivos que representam componentes de hardware.
/etc
Contém arquivos de configuração local que controlam a operação de programas como o Sistema X Window. O subdiretório /etc/init.d contém scripts init LSB que podem ser executados durante o processo de boot.
/home/nome_do_usuário
Contém os dados privados de todos os usuários que possuem uma conta no sistema. Os arquivos localizados aqui apenas podem ser modificados por seu proprietário ou pelo administrador do sistema. Por padrão, o diretório de e-mail e a configuração de área de trabalho pessoal estão localizados aqui, na forma de arquivos e diretórios ocultos, como .gconf/ e .config.
Se você estiver trabalhando em um ambiente de rede, seu diretório pessoal poderá ser mapeado para um diretório no sistema de arquivos diferente de /home.
/lib
Contém as bibliotecas compartilhadas essenciais necessárias para inicializar o sistema e executar os comandos no sistema de arquivos raiz. O equivalente no Windows para as bibliotecas compartilhadas são os arquivos DLL.
/media
Contém pontos de montagem para mídia removível, como CD-ROMs, discos flash e câmeras digitais (se usarem USB). /media geralmente mantém qualquer tipo de unidade, exceto o disco rígido do sistema. Assim que a mídia removível for inserida ou conectada no sistema e estiver montada, você poderá acessá-la a partir daqui.
/mnt
O diretório fornece um ponto de montagem para um sistema de arquivos montado temporariamente. O root pode montar sistemas de arquivos aqui.
/opt
Reservado para a instalação de software de terceiros. Software opcional e pacotes de programas complementares maiores são encontrados aqui.
/root
Diretório pessoal do usuário root. Os dados pessoais do root estão localizados aqui.
/run
Um diretório tmpfs usado pelo systemd e por vários componentes.
/sbin
Como indicado pelo s, esse diretório contém utilitários do superusuário. /sbin contém os binários essenciais para boot, restauração e recuperação do sistema, além dos binários em /bin.
/srv
Contém dados de serviços fornecidos pelo sistema, como FTP e HTTP.
/tmp
Esse diretório é usado por programas que exigem o armazenamento temporário dos arquivos.
/tmp em tempo de boot
Os dados armazenados em /tmp podem não existir após uma reinicialização do sistema. Depende, por exemplo, das configurações em /etc/sysconfig/cron.
/usr
O /usr não tem relação com os usuários, mas se trata do acrônimo de Unix system resources (recursos do sistema Unix). Os dados em /usr são estáticos e apenas leitura, podendo ser compartilhados entre vários hosts compatíveis com FHS (Filesystem Hierarchy Standard – Padrão da Hierarquia do Sistema de Arquivos). Este diretório contém todos os programas de aplicativo, incluindo as áreas de trabalho gráficas, como o GNOME, e estabelece uma hierarquia secundária no sistema de arquivos. /usr contém alguns subdiretórios como /usr/bin, /usr/sbin, /usr/local e /usr/share/doc.
/usr/bin
Contém programas geralmente acessíveis.
/usr/bin
Contém programas reservados ao administrador do sistema, como as funções de reparo.
/usr/local
Nesse diretório, o administrador do sistema pode instalar extensões locais e independentes de distribuição.
/usr/share/doc
Contém vários arquivos de documentação e as notas de versão do sistema. No subdiretório manual, você encontra uma versão online deste manual. Se houver mais de um idioma instalado, esse diretório poderá conter versões dos manuais em idiomas diferentes.
Em packages, você encontra a documentação incluída nos pacotes de software instalados no sistema. Para cada pacote, é criado um subdiretório /usr/share/doc/packages/nome_do_pacote, geralmente contendo arquivos README do pacote e, por vezes, exemplos, arquivos de configuração ou scripts adicionais.
Se houver HOWTOs instalados no sistema, /usr/share/doc também conterá o subdiretório howto, com documentação adicional sobre muitas tarefas relacionadas a configuração e operação do software Linux.
/var
Ao passo que /usr contém dados estáticos apenas leitura, /var destina-se aos dados gravados durante a operação do sistema, portanto variáveis, como arquivos de registro ou de spool. Para obter uma visão geral dos arquivos de registro mais importantes que estão em /var/log/, consulte a Tabela 30.1, “Arquivos de registro”.
/windows
Disponível apenas se você tiver o Microsoft Windows e o Linux instalados no sistema. Contém os dados do Windows disponíveis na partição Windows do sistema. A sua capacidade de editar dados nesse diretório depende do sistema de arquivos usado pelas partições Windows. No caso do FAT32, você pode abrir e editar os arquivos desse diretório. Para NTFS, o SUSE Linux Enterprise Desktop também oferece suporte a acesso de gravação. No entanto, o driver para o sistema de arquivos NTFS-3g possui funcionalidade limitada.
Scripts shell são convenientes para todos os tipos de tarefas: coleta de dados, pesquisa por uma palavra ou frase em um texto e muitas outras coisas úteis. O exemplo seguinte mostra um pequeno script shell que imprime um texto:
#!/bin/sh 1 # Output the following line: 2 echo "Hello World" 3
Antes de executar esse script, você precisa de alguns pré-requisitos:
Todo script deve conter uma linha Shebang (como foi o caso do nosso exemplo acima). Se um script não tiver essa linha, você deverá chamar o interpretador manualmente.
Grave o script no lugar desejado. Contudo, convém gravá-lo em um diretório onde o shell possa encontrá-lo. O caminho de pesquisa em um shell é determinado pela variável de ambiente PATH. Um usuário normal geralmente não tem acesso de gravação em /usr/bin. Por essa razão, recomenda-se gravar seus scripts no diretório ~/bin/ dos usuários. O exemplo acima leva o nome hello.sh.
O script requer permissões de executável. Defina as permissões com o seguinte comando:
chmod +x ~/bin/hello.sh
Se você atendeu a todos os pré-requisitos acima, poderá executar o script das seguintes maneiras:
Como caminho absoluto.
O script pode ser executado em um caminho absoluto. No nosso caso, ele é ~/bin/hello.sh.
Em todos os lugares.
Se a variável de ambiente PATH incluir o diretório no qual o script está localizado, você poderá executar o script usando o comando hello.sh.
Cada comando pode usar três canais, seja para entrada ou para saída:
Saída padrão. Esse é o canal de saída padrão. Sempre que um comando imprime algo, ele usa o canal de saída padrão.
Entrada padrão. Se um comando precisar da entrada dos usuários ou de outros comandos, ele usará esse canal.
Erro padrão. Os comandos usam esse canal para gerar relatórios de erros.
Para redirecionar os canais, as possibilidades são as seguintes:
Comando > Arquivo
Grava a saída do comando em um arquivo, apagando um arquivo existente. Por exemplo, o comando ls grava sua saída no arquivo listing.txt:
ls > listing.txt
Comando >> Arquivo
Anexa a saída do comando a um arquivo. Por exemplo, o comando ls anexa sua saída ao arquivo listing.txt:
ls >> listing.txt
Comando < Arquivo
Lê o arquivo como entrada do comando em questão. Por exemplo, o comando read extrai o conteúdo do arquivo para a variável:
read a < foo
Comando1 | Comando2
Redireciona a saída do comando à esquerda como entrada para o comando à direita. Por exemplo, o comando cat gera a saída do conteúdo do arquivo /proc/cpuinfo. Essa saída é usada por grep para filtrar apenas as linhas que contêm cpu:
cat /proc/cpuinfo | grep cpu
Cada canal possui um descritor de arquivo: 0 (zero) para entrada padrão, 1 para saída padrão e 2 para erro padrão. É permitido inserir esse descritor de arquivo antes de um caractere < ou >. Por exemplo, a linha a seguir procura por um arquivo que começa com foo, mas suprime seus erros redirecionando-o para /dev/null:
find / -name "foo*" 2>/dev/null
Um álias é uma definição de atalho de um ou mais comandos. A sintaxe de um álias é a seguinte:
alias NAME=DEFINITION
Por exemplo, a linha a seguir define um álias lt que gera uma listagem extensa (opção -l), classifica-a por horário de modificação (-t) e imprime-a em ordem inversa ao classificar (-r):
alias lt='ls -ltr'
Para ver todas as definições de álias, use alias Remova o seu álias com unalias e o nome de álias correspondente.
Uma variável de shell pode ser global ou local. Variáveis globais, ou de ambiente, podem ser acessadas em todos os shells. As variáveis locais, ao contrário, são visíveis apenas no shell atual.
Para ver todas as variáveis de ambiente, use o comando printenv. Se for preciso saber o valor de uma variável, insira o nome da variável como argumento:
printenv PATH
Uma variável, seja ela global ou local, também pode ser visualizada com echo:
echo $PATH
Para definir uma variável local, use um nome de variável, seguido pelo sinal de igual, seguido pelo valor:
PROJECT="SLED"
Não insira espaços antes e depois do sinal de igual, senão você obterá um erro. Para definir uma variável de ambiente, use export:
export NAME="tux"
Para remover uma variável, use unset:
unset NAME
A tabela a seguir contém algumas variáveis de ambiente comuns que podem ser usadas nos seus scripts shell:
|
|
diretório pessoal do usuário atual |
|
|
nome do host atual |
|
|
quando uma ferramenta é localizada, ela usa o idioma dessa variável de ambiente. Também é possível definir o idioma inglês como |
|
|
caminho de pesquisa do shell, uma lista de diretórios separados por dois-pontos |
|
|
especifica o prompt normal impresso antes de cada comando |
|
|
especifica o prompt secundário impresso quando você executa um comando em várias linhas |
|
|
diretório de trabalho atual |
|
|
usuário atual |
Por exemplo, se você tiver o script foo.sh, poderá executá-lo desta maneira:
foo.sh "Tux Penguin" 2000
Para acessar todos os argumentos que são passados ao seu script, você precisa de parâmetros de posição. Isto é, $1 para o primeiro argumento, $2 para o segundo e assim sucessivamente. É possível usar até nove parâmetros. Para obter o nome do script, use $0.
O script foo.sh a seguir imprime todos os argumentos de 1 a 4:
#!/bin/sh echo \"$1\" \"$2\" \"$3\" \"$4\"
Se você executar esse script com os argumentos acima, obterá:
"Tux Penguin" "2000" "" ""
As substituições de variáveis aplicam um padrão ao conteúdo de uma variável, seja da esquerda ou da esquerda. A lista a seguir contém as formas de sintaxe possíveis:
${VAR#padrão}
remove a correspondência mais curta possível da esquerda:
file=/home/tux/book/book.tar.bz2
echo ${file#*/}
home/tux/book/book.tar.bz2${VAR##padrão}
remove a correspondência mais longa possível da esquerda:
file=/home/tux/book/book.tar.bz2
echo ${file##*/}
book.tar.bz2${VAR%padrão}
remove a correspondência mais curta possível da direita:
file=/home/tux/book/book.tar.bz2
echo ${file%.*}
/home/tux/book/book.tar${VAR%%padrão}
remove a correspondência mais longa possível da direita:
file=/home/tux/book/book.tar.bz2
echo ${file%%.*}
/home/tux/book/book${VAR/padrão_1/padrão_2}
substitui o conteúdo de VAR do padrão_1 pelo do padrão_2:
file=/home/tux/book/book.tar.bz2
echo ${file/tux/wilber}
/home/wilber/book/book.tar.bz2Os shells permitem concatenar e agrupar comandos para uma execução condicional. Cada comando retorna um código de saída que determina o sucesso ou a falha de sua operação. Se o código for 0 (zero), significa que o comando obteve sucesso. Todos os outros códigos significam erro específico do comando.
A lista a seguir mostra como os comandos podem ser agrupados:
Comando1 ; Comando2
executa os comandos em sequência. O código de saída não é verificado. A linha a seguir exibe o conteúdo do arquivo com cat e depois imprime suas propriedades com ls, independentemente dos códigos de erro:
cat filelist.txt ; ls -l filelist.txt
Comando1 && Comando2
executa o comando à direita quando o comando à esquerda for bem-sucedido (E lógico). A linha a seguir exibe o conteúdo do arquivo e imprime suas propriedades apenas quando o comando anterior obtiver sucesso (compare com a entrada anterior nesta lista):
cat filelist.txt && ls -l filelist.txt
Comando1 || Comando2
executa o comando à direita quando o comando da esquerda falhar (OU lógico). A linha a seguir cria um diretório em /home/wilber/bar apenas quando a criação do diretório em /home/tux/foo falhar:
mkdir /home/tux/foo || mkdir /home/wilber/bar
nome_da_função(){ ... }
cria uma função shell. Você pode usar os parâmetros de posição para acessar seus argumentos. A linha a seguir define a função hello para imprimir uma mensagem curta:
hello() { echo "Hello $1"; }Você pode chamar essa função assim:
hello Tux
que imprimirá:
Hello Tux
Para controlar o fluxo do seu script, um shell possui as construções while, if, for e case.
O comando if é usado para verificar expressões. Por exemplo, o código a seguir testa se o usuário atual é Tux:
if test $USER = "tux"; then echo "Hello Tux." else echo "You are not Tux." fi
A expressão de teste pode ser tão complexa ou simples quanto possível. a expressão a seguir verifica se o arquivo foo.txt existe:
if test -e /tmp/foo.txt ; then echo "Found foo.txt" fi
A expressão de teste também pode ser abreviada entre colchetes:
if [ -e /tmp/foo.txt ] ; then echo "Found foo.txt" fi
Outras expressões úteis estão disponíveis em http://www.cyberciti.biz/nixcraft/linux/docs/uniqlinuxfeatures/lsst/ch03sec02.html.
O loop for permite executar comandos para uma lista de entradas. Por exemplo, o código a seguir imprime algumas informações sobre arquivos PNG no diretório atual:
for i in *.png; do ls -l $i done
Informações importantes sobre o Bash são fornecidas nas páginas de manual man bash. Mais informações sobre este tópico estão disponíveis na lista a seguir:
http://tldp.org/LDP/Bash-Beginners-Guide/html/index.html— Bash Guide for Beginners (Guia do Bash para Iniciantes)
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html— BASH Programming - Introduction HOW-TO (COMO FAZER Programação de Bash: Introdução)
http://tldp.org/LDP/abs/html/index.html— Advanced Bash-Scripting Guide (Guia Avançado de Criação de Scripts Bash)
http://www.grymoire.com/Unix/Sh.html— Sh - the Bourne Shell (Sh: o Bourne Shell)