Variáveis do Shell

Existem variáveis que o shell usa constantemente para um melhor funcionamento. O próprio shell inicializa algumas destas variáveis, que podem ser lidas e alteradas pelo usuário, estas são conhecidas como variáveis do shell. Servem para determinar qual é o seu diretório home, em qual diretório o shell vai procurar por comandos que você digitar, seu prompt... enfim... um bocado de coisas. Você pode atribuir novos valores para estas variáveis (uma boa é fazer isso no seu ~/.bashrc ou ~/.bash_profile).

Vamos ver algumas destas variáveis mais importantes e suas respectivas funções.

HOME

Esta variável tem um nome bem descritivo não acham? Bem... como nós já sabemos, o nosso diretório home é o diretório em que "caímos" assim que nos logamos (sabemos também que esta informação se encontra em /etc/passwd). Quando você se loga no sistema o bash pega o nome do diretório que você está e o atribui à variável HOME.

Você já deve ter percebido que quando você dá um cd sem nenhum argumento você vai para o seu diretório home. Pois o que o cd faz é o mesmo que cd $HOME. Se você alterar o valor de HOME, quando você digitar cd sem nenhum argumento o bash vai tentar te levar para o $HOME. Veja:

meleu:/usr/doc$ echo $HOME
/home/meleu
meleu:/usr/doc$ cd
meleu:~$ pwd
/home/meleu
meleu:~$ HOME=/tmp
meleu:/home/meleu$ cd
meleu:~$ pwd
/tmp
meleu:~$ HOME=lalala
meleu:/tmp$ cd
bash: cd: lalala: No such file or directory

Você também já deve ter reparado que quando estamos no nosso home aparece um til ~ logo antes do prompt. Observe este detalhe no exemplo acima. ;)

PATH

Esta variável armazena o caminho (path) que o shell irá percorrer para procurar um comando digitado pelo usuário. Exemplo:

meleu@meleu:/tmp$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games:/usr/share/texmf/bin

Portanto se eu digitar um ls o shell irá procurar por esse comando em /usr/local/bin depois em /usr/bin e vai seguindo a lista até encontrar o comando ou chegar ao final da lista. Se o comando não estiver em nenhum dos diretórios do PATH, obtemos a famos mensagem command not found.

Esta variável algumas vezes pode ser usada no hacking! Imagine que um programador inexperiente tenha feito um programa suid que usa a função system() (ou qualquer outra função que sirva para executar um comando externo), e nesta função ele não usa o caminho completo do programa, e sim apenas o nome do programa, supondo que o programa está no seu PATH normal. Você pode alterar o PATH e executar um outro programa de sua preferência.

Vamos supor que o cara use:

system ("date");

no lugar de:

system("/bin/date");

Aí você faz um programa ou um shell script e nomeia ele como date. Agora é só alterar o PATH para que procure primeiro no diretório onde você salvou o SEU date, e então executar o programa suid feito pelo incompetente programador. Faça uns testes aí que você vai me entender melhor.

Esta situação é bem difícil de se encontrar hoje em dia, resolvi colocar aqui por questões históricas.

PS1

Esta é a "Prompt String 1" ou "Primary Prompt String". Nada mais é do que o prompt que nos mostra que o shell está esperando um comando. Quando você muda PS1 você muda a aparencia do prompt. Na minha máquina o padrão é '\u@\h:\w\$ ' onde \u significa o nome do usuario, \h significa o nome do host e \w é o diretório atual, o que dá a seguinte aparência:

meleu@meleu:/usr/doc/Linux-HOWTOs$

Veja algumas possibilidades (na man page do bash tem mais):

caracter o que faz:
\d mostra a data atual
\h mostra o hostname
\s o nome do shell
\t a hora atual (no estilo 24 horas)
\T a hora atual (no estilo 12 horas)
\u nome do usuário que está usando o shell
\w nome do diretório atual (caminho todo)
\W nome do diretório atual (somente o nome do diretório)

Para aprender a fazer um monte de gracinhas com o PS1 dê uma lida no Bash-Prompt-HOWTO (ver Referências).

PS2

Esta é a "Secondary Prompt String". É usada quando um comando usa mais de uma linha. Por exemplo:

$ echo m\
> e\
> l\
> e\
> u
meleu
$ echo 'm
> e
> l
> e
> u'
m
e
l
e
u

Este sinal > (maior-espaço) é o PS2. Você pode usar os mesmos caracteres especiais que o PS1 usa.

SHLVL

Esta variável armazena quantos shells você executou a partir da primeira shell.

Confuso? Vamos a um exemplo. Imagine que você está usando o bash e executou o bash de novo, nesta situação o seu SHLVL vale 2. Veja isto:

$ echo $SHLVL
1
$ bash        # estou executando o bash a partir do bash
$ echo $SHLVL
2
$ exit        # saí do segundo bash
exit
$ echo $SHLVL
1

Quando você inicializa scripts a partir do comando source o script é executado no shell pai, portanto se tiver um exit no script você vai executar um logoff. É aí que está a utilidade da variável SHLVL. Quando você está no shell primário o valor de SHLVL é 1. Então para evitar um logoff inadvertido, você pode fazer isso:

if [ "$SHLVL" -ne 1 ]; then
    exit
else
    return
fi

Mais informações sobre o source em Funções como Comandos.

PROMPT_COMMAND

Esta é bem interessante. Ela armazena um comando que será executado toda hora que o prompt é exibido. Veja:

$ PROMPT_COMMAND="date +%T"
19:24:13
$ cd
19:24:17
$ ls
GNUstep/  bons.txt  pratica/  teste  worldwritable.txt
Mail/     hacking/  progs/    txts/
19:24:19
$
19:24:32
$  # isso eh uma linha sem nenhum comando
19:24:49
$

Esta variável é útil quando queremos brincar com o prompt, para aprender mais sobre isso leia o Bash-Prompt-HOWTO (ver Referências).

IFS

O shell usa esta variável para dividir uma string em palavras separadas. Normalmente o IFS é um espaço, uma tabulação (tab) e um caractere nova linha \n. Desta maneira:

isto eh uma string

são quatro palavras: isto, eh, uma e string. Pois IFS é um espaço e as palavras estão separadas por espaço. Agora se eu mudar IFS para um : desta maneira:

IFS=':'

então a string:

isto:eh:uma:string

conterá quatro palavras. Isto é útil para casos como neste exemplo:

#!/bin/bash
# path.sh

IFS=':'

for item in $PATH ; do
	echo $item
done

Se IFS for uma variável nula (vazia), tudo será considerado uma única string. Por exemplo:

se o IFS for nulo, toda essa linha será considerada uma única string

RANDOM

Quando você exibe esta variável (echo $RANDOM) é exibido um número aleatório entre 0 e 32767.

Pra que serve isso? Várias coisas. Quem é criativo sempre precisa de um número aleatório... No exemplo a seguir temos um simulador de cara ou coroa para ilustrar a utilidade do RANDOM:

#!/bin/bash
# cara-ou-coroa.sh
# crédito do código: Matheus Alves - https://github.com/theuves

# se o número aleatório é par, temos "Cara", se for ímpar temos "Coroa"
[ $[ $RANDOM % 2 ] = 0 ] && echo "Cara" || echo "Coroa"

Outras

Outras variáveis que são muito usadas: HISTFILE; HOSTNAME; LS_OPTIONS; LS_COLOR; MANPATH; SHELL; TERM; USER; PS3.

Estas são as mais utilizadas, porém existem muitas outras. Para ver quais são as variáveis definidas no momento basta entrar com o comando set. E para ver apenas as variáveis de ambiente use env.

Olhe a man page do bash na seção "Shell Variables" para mais detalhes.

results matching ""

    No results matching ""