103.1 Lição 2
Certificação: |
LPIC-1 |
---|---|
Versão: |
5.0 |
Tópico: |
103 Comandos GNU e Unix |
Objetivo: |
103.1 Trabalho na linha de comando |
Lição: |
2 de 2 |
Introdução
Um ambiente de sistema operacional inclui as ferramentas básicas — como shells de linha de comando e, às vezes, uma interface gráfica — necessárias para trabalhar. Mas seu ambiente também virá com um catálogo de atalhos e valores predefinidos. Nesta lição aprenderemos como listar, invocar e gerenciar esses valores.
Encontrando suas variáveis de ambiente
Então, como identificamos os valores atuais para cada uma de nossas variáveis de ambiente? Uma maneira de fazer isso é por meio do comando env
:
$ env DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus XDG_RUNTIME_DIR=/run/user/1000 XAUTHORITY=/run/user/1000/gdm/Xauthority XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin GJS_DEBUG_TOPICS=JS ERROR;JS LOG [...]
Aparecerão muitos resultados — bem mais do que os incluídos no trecho acima. Mas, por enquanto, observe a entrada PATH
, que contém os diretórios nos quais seu shell (e outros aplicativos) procura por outros programas sem a necessidade de especificar um caminho completo. Neste caso, seria possível executar um programa binário que reside, digamos, em /usr/local/bin
de dentro do seu diretório pessoal, e ele seria executado como se o arquivo fosse local.
Vamos mudar de assunto um pouquinho. O comando echo
exibe na tela o que você mandar. Acredite ou não, haverá diversas ocasiões em que será muito útil fazer echo
literalmente repetir algo.
$ echo "Hi. How are you?" Hi. How are you?
Mas echo
tem outras cartas na manga. Quando você o alimenta com o nome de uma variável de ambiente — e informa que se trata de uma variável, com o prefixo $
— ao invés de apenas exibir o nome da variável, o shell irá expandi-lo, informando o valor. Não tem certeza se o seu diretório favorito está atualmente em PATH
? Você pode verificar rapidamente com o echo
:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Criando novas variáveis de ambiente
Você pode adicionar suas próprias variáveis personalizadas ao seu ambiente. A maneira mais simples é usar o caractere =
. A string à esquerda será o nome da nova variável e a string à direita, seu valor. Depois, alimente echo
com o nome da variável para confirmar se funcionou:
$ myvar=hello $ echo $myvar hello
Note
|
Note que não há espaços em torno do sinal de igual durante a atribuição de variáveis. |
Mas será que funcionou mesmo? Digite bash
no terminal para abrir um novo shell. Ele terá exatamente a mesma aparência daquele que acabamos de usar, mas na verdade é um filho do original (que chamamos de pai). Agora, dentro desse novo shell filho, tente fazer com que o echo
opere sua mágica da mesma maneira de antes. Nada. O que aconteceu?
$ bash $ echo $myvar $
Uma variável criada da maneira como acabamos de fazer só estará disponível localmente — dentro daquela sessão de shell imediata. Se você iniciar um novo shell — ou fechar a sessão usando exit
— a variável não irá junto. Aqui, se você digitar exit
, será levado de volta ao shell pai original que, no momento, é onde queremos estar. Execute echo $myvar
mais uma vez se quiser apenas confirmar que a variável ainda é válida. Depois digite export myvar
para passar a variável para quaisquer shells filhos que possam ser abertos posteriormente. Experimente: digite bash
para abrir um novo shell e em seguida use echo
:
$ exit $ export myvar $ bash $ echo $myvar hello
Tudo isso pode parecer bobagem quando estamos criando shells sem um propósito real. Mas é importantíssimo entender como as variáveis do shell são propagadas pelo sistema para quando você começar a escrever scripts sérios.
Removendo as variáveis de ambiente
Quer saber como limpar todas as variáveis efêmeras que você criou? Uma maneira de fazer isso é simplesmente fechar o shell pai — ou reiniciar o computador. Mas existem jeitos mais simples. Como, por exemplo, unset
. Basta digitar unset
(sem o $
) para matar a variável. Comprove com echo
.
$ unset myvar $ echo $myvar $
Se um comando unset
existe, pode apostar que também há um comando set
complementar. A execução de set
por si só exibirá um monte de saídas, mas nada muito diferente de env
. Observe a primeira linha da saída obtida ao filtrarmos por PATH
:
$ set | grep PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin [...]
Qual a diferença entre set
e env
? Para nossos propósitos, a principal delas é que set
exibe todas as variáveis e funções. Para ilustrar isso, vamos criar uma nova variável chamada mynewvar
e em seguida confirmar se ela está lá:
$ mynewvar=goodbye $ echo $mynewvar goodbye
Se rodarmos env
usando grep
para filtrar pela string mynewvar
, nenhuma saída será exibida. Mas se rodarmos set
da mesma maneira, veremos nossa variável local.
$ env | grep mynewvar $ set | grep mynewvar mynewvar=goodbye
Usando aspas para escapar dos caracteres especiais
Este é um bom momento para apresentar o problema dos caracteres especiais. Os caracteres alfanuméricos (a-z e 0-9) normalmente são lidos literalmente pelo Bash. Para criar um novo arquivo chamado myfile
, bastaria digitar touch
seguido de myfile
e o Bash saberia o que fazer. Mas se quisermos incluir um caractere especial no nome do arquivo, teríamos um pouco mais de trabalho.
Para ilustrar esse fato, digitaremos touch
e em seguida o título: my big file
. O problema é que existem dois espaços entre as palavras que o Bash interpretará. Embora, tecnicamente, espaços não sejam “caracteres”, é assim que eles se comportam, já que o Bash não os lerá literalmente. Se você listar o conteúdo do diretório atual, em vez de um arquivo chamado my big file
, verá três arquivos chamados, respectivamente, my
, big
, e file
. Isso porque o Bash pensou que você queria criar vários arquivos cujos nomes estavam sendo dados em uma lista:
$ touch my big file $ ls my big file
Os espaços serão interpretados da mesma forma se você excluir (rm
) os três arquivos com um só comando:
$ rm my big file
Agora, vamos fazer do jeito certo. Digite touch
e as três partes do seu nome de arquivo, mas desta vez coloque o nome entre aspas. Desta vez, funciona. Ao listar o conteúdo do diretório, veremos um único arquivo com o nome correto.
$ touch "my big file" $ ls 'my big file'
Existem outras maneiras de obter o mesmo efeito. As aspas simples, por exemplo, funcionam da mesma forma que as aspas duplas (note que as aspas simples preservam o valor literal de todos os caracteres, ao passo que as aspas duplas preservam todos os caracteres exceto $
, `
, \
e, em certos casos, !
.)
$ rm 'my big file'
Podemos incluir uma barra invertida antes de cada caractere especial para “escapar” dessa característica e fazer com que o Bash o leia literalmente.
$ touch my\ big\ file
Exercícios Guiados
-
Use o comando
export
para adicionar um novo diretório ao seu caminho (PATH
) — ele não sobreviverá a uma reinicialização. -
Use o comando
unset
para remover a variávelPATH
. Tente executar um comando (comosudo cat /etc/shadow
) usandosudo
. O que aconteceu? Por quê? (saia do shell para retornar ao estado original.)
Exercícios Exploratórios
-
Procure na internet a lista completa de caracteres especiais e explore-os.
-
Tente executar comandos usando strings compostas de caracteres especiais e diversos métodos para escapar deles. Existem diferenças de comportamento entre esses métodos?
Resumo
Nesta lição, você aprendeu:
-
Como identificar as variáveis de ambiente de seu sistema.
-
Como criar suas próprias variáveis de ambiente e exportá-la para outros shells.
-
Como remover variáveis de ambiente e usar os comandos
env
eset
. -
Como escapar dos caracteres especiais para que o Bash os leia literalmente.
Os seguintes comandos foram abordados nesta lição:
echo
-
Exibe as strings e variáveis informadas.
env
-
Entende e modifica suas variáveis de ambiente.
export
-
Passa uma variável de ambiente para os shells filhos.
unset
-
Desconfigura os valores e atributos das variáveis e funções do shell.
Respostas aos Exercícios Guiados
-
Use o comando
export
para adicionar um novo diretório ao seu caminho (PATH
) — ele não sobreviverá a uma reinicialização.Podemos adicionar temporariamente um novo diretório (por exemplo, um chamado
myfiles
dentro do diretório inicial) ao caminho usandoexport PATH="/home/yourname/myfiles:$PATH"
. Crie um script simples no diretóriomyfiles/
, torne-o executável e tente executá-lo a partir de um diretório diferente. Estes comandos pressupõem que você esteja no diretório inicial, que contém um diretório chamadomyfiles
.$ touch myfiles/myscript.sh $ echo '#!/bin/bash' >> myfiles/myscript.sh $ echo 'echo Hello' >> myfiles/myscript.sh $ chmod +x myfiles/myscript.sh $ myscript.sh Hello
-
Use o comando
unset
para remover a variávelPATH
. Tente executar um comando (comosudo cat /etc/shadow
) usandosudo
. O que aconteceu? Por quê? (saia do shell para retornar ao estado original.)O comando
unset PATH
apaga as configurações de caminho atuais. Não será possível invocar um binário sem seu endereço absoluto. Por essa razão, se tentarmos rodar um comando usando sudo (que por sua vez é um programa binário localizado em/usr/bin/sudo
) a operação falhará — a menos que especifiquemos a localização absoluta, como em:/usr/bin/sudo /bin/cat /etc/shadow
. Podemos redefinir oPATH
usandoexport
ou simplesmente saindo do shell.
Respostas aos Exercícios Exploratórios
-
Procure na internet a lista completa de caracteres especiais e explore-os.
Eis uma lista:
& ; | * ? " ' [ ] ( ) $ < > { } # / \ ! ~
. -
Tente executar comandos usando strings compostas de caracteres especiais e diversos métodos para escapar deles. Existem diferenças de comportamento entre esses métodos?
O escape com
"
preserva os valores especiais do cifrão, da crase e da barra invertida. Já o escape com o'
faz com que todos os caracteres sejam interpretados literalmente.$ echo "$mynewvar" goodbye $ echo '$mynewvar' $mynewvar