7 variáveis ​​Bash que uso em quase todos os scripts

por Nada Em Troca
8 minutos de leitura
7 variáveis ​​Bash que uso em quase todos os scripts

Você está aprendendo Bash atualmente? Você já viu coisas como $0 e $EUID e se perguntou o que eles significam? Ou qual é a diferença entre $UID e $EUID? Abordarei isso e muito mais: o que eles fazem e por que são importantes.

Calendário completo HTG embrulhado - 24 de dezembro
HTG Wrapped 2025: 24 dias de tecnologia

24 dias de nossos hardwares, gadgets e tecnologia favoritos

4
Por Will Verduzco

Parâmetros especiais

Parâmetros especiais são variáveis ​​fornecidas pelo Bash para fins específicos. Existem menos de 10 deles, e os seguintes considero os mais úteis.

Obtenha o caminho do script

Às vezes, quando você está escrevendo um roteiro, você quer saber seu caminho. Por exemplo, ao criar um menu de ajuda, é habitual incluir o nome do script no topo. Aqui está o menu de ajuda para o comando ls:

ls --help
Uma janela de terminal exibe a saída do comando ls. Ele destaca que o nome do comando está visível no menu de ajuda.-1

Você pode acessar o caminho (relativo) usando o $0 parâmetro especial. É um padrão POSIX, então você pode usá-lo na maioria dos shells:

echo "$0"
Uma janela de terminal exibe um caminho relativo para um script.

Então você pode obter o nome do script usando $(basename $0):

Uma janela de terminal exibe o nome de um script: script.sh.

No entanto, às vezes $0 não é confiável – por exemplo, fonte /path/to/script.sh retorna “bash” e não o caminho do script. Em vez disso, use o $BASH_SOURCE variável, que funciona quase de forma idêntica, exceto sem surpresas. Se você usa apenas o Bash, é a melhor escolha, mas não é portável para outros shells.

Determinar o status de saída de um processo

Cada programa retorna um número ao sair. É chamado de código de saída e é usado para tomar decisões quando um comando retorna um erro. Por exemplo, se você tentar ls um diretório inexistente, ele retorna um valor diferente de zero.

Um status de saída zero significa sucesso; diferente de zero indica um problema.

Ao encontrar um problema, você pode querer interromper a execução e o $? parâmetro especial fornece o código de saída necessário:

ls /system32 echo $?
Uma janela de terminal exibe uma mensagem de erro do comando ls. Afirma que o diretório consultado não existe. Ele também exibe o número 2.-1

Existem várias maneiras de detectar e tratar um código de saída. O mais óbvio é avaliar “$?” com uma declaração condicional:

if [[ $? -eq 0 ]]; then    # If the script executed successfully. fi

O código de saída geralmente significa alguma coisa e é específico do programa, mas você pode lidar com valores distintos com uma instrução case:

case $? in   0) echo "OK";;   1) echo "Err";;   *) echo "Unhandled error";; esac

Uma abordagem favorita minha é usar uma instrução condicional sem colchetes:

if ls /system32; then   # Upon zero exit code.   echo "/system32 exists" fi

Mas a solução mais elegante é usar operadores lógicos:

ls /system32 && echo "/system32 exist" # && executes on zero exit status. ls /system32 || echo "/system32 does not exist" # || executes on non-zero exit status.

Argumentos de acesso

Se você estiver escrevendo um script Bash, invariavelmente precisará passar valores para ele – também conhecidos como argumentos ou parâmetros posicionais. A abordagem do Bash é um pouco desajeitada, mas funciona. Os exemplos são a maneira mais fácil de entendê-los:

foo() {   echo "$1" # First argument.   echo "$2" # Second argument. } foo "first" "second"

Passei argumentos para uma função, mas eles funcionam exatamente da mesma forma no nível superior do seu script. Por exemplo:

#!/usr/bin/env bash # This is the top-level of your script. echo "The first argument: $1" echo "The second argument: $2"

Você pode então passar argumentos para o seu script por meio da CLI: script.sh "first" "second".

Continuando, o parâmetro especial “$@” representa todos os argumentos como um array:

foo() {   for arg in "$@"; do     echo "$arg"   done } foo "first" "second" 
Uma janela de terminal exibe as palavras primeiro e segundo em duas linhas.

O parâmetro especial “$*” é igual a “$@”, exceto que coloca todos os argumentos em uma string (se “$*” tiver aspas duplas):

at() {   printf '@: [%s]n' "$@" }  star() {   printf '*: [%s]n' "$*" }  at   "one two" "three" star "one two" "three"
Uma janela de terminal exibe os resultados das variáveis ​​especiais 'at' e 'star'. A variável ‘at’ tem seu conteúdo impresso em múltiplas linhas, e a variável ‘star’ em uma única linha.

Você pode ver que “$@” imprime os dois argumentos em duas linhas, mas “$*” os imprime em uma linha.

Para obter o número de argumentos, você pode usar o ${#@} ou ${#*} sintaxe:

foo() {   echo ${#@}   echo ${#*} } foo "one" "two"
Uma janela de terminal exibe o número 2 duas vezes, em duas linhas.

Variáveis ​​de ambiente

Variáveis ​​de ambiente são valores fornecidos para programas em execução pelo shell. Por exemplo, $HOME fornece o caminho para o diretório inicial do usuário atual.

Obtenha o ID do usuário

Ocasionalmente, preciso saber o ID do usuário atual em um script. Por exemplo, recentemente eu estava interagindo com um soquete no /run/user/1000 diretório. O “1000” é o ID do usuário e, se quisermos um script robusto, não devemos codificar esse valor, porque outro usuário que o executa pode ter um ID de usuário diferente.

Para resolver isso, podemos usar o $UID e $EUID variáveis. “$UID” exibe o ID do usuário que está executando um binário. “$EUID” (ID de usuário efetivo) é o ID de usuário do processo que executa um binário. Normalmente, eles são iguais, mas para binários setuid eles podem ser diferentes. Por exemplo, ao executar algo com sudo, eles variam conforme a bifurcação avança em diferentes estágios.

ps --forest -eo cmd,euid,ruid | grep -C 1 '[s]udo'
Uma janela de terminal mostra uma árvore de processos bifurcados. Isso mostra que a execução de binários UID definidos faz com que o UID e o EUID mudem de 1000 para 0.

Eu tenho “sudo sleep 600” em execução em segundo plano, e o prompt acima exibe as colunas de comando, EUID (“1”) e UID (“2”) para qualquer processo executando o sudo. Você pode ver que o EUID se torna “0” imediatamente, mas o UID não muda até o processo bifurcado final (que está “suspenso” sendo executado como root).

Tux, o mascote do Linux, usando óculos escuros e espiando por trás de uma grande janela de terminal exibindo comandos globulares.
8 truques do shell do Linux que mudam completamente a forma como os comandos funcionam

O shell faz muito mais do que executar comandos. Veja como o Bash expande sua entrada nos bastidores para que você possa escrever comandos mais limpos e confiáveis.

2
Por Bobby Jack

O que podemos tirar disso? Bem, realmente não importa qual você usa. Alguns dizem usar “$EUID” para verificar se você tem privilégios de root, porque são as permissões efetivas. No entanto, você pode ver na imagem que o processo final de “suspensão” tem UID e EUID definidos como “0” (root), e o processo shell tem ambos definidos como “1000” (usuário). Eles representam o final do processo de bifurcação – onde você iniciou a solicitação sudo e também o processo de execução final. Portanto, não há nenhuma distinção útil entre eles quando é importante, mas lembre-se de que eles diferem para binários setuid durante o processo de bifurcação.

Obtenha caminhos de usuário comuns

Em quase todos os scripts que escrevo, acesso o diretório inicial. Com menos frequência, preciso de acesso a ~/.config ou ~/.local/share. Acessar locais típicos no sistema de arquivos é comum, mas caminhos codificados como esse são uma prática inadequada porque podem mudar. A abordagem recomendada é usar a especificação de diretório XDG, que é um conjunto de variáveis ​​padrão fornecidas por freedesktop.org.

env | grep XDG | sort -u
Uma janela de terminal exibe uma lista de nove variáveis ​​XDG, que consiste em caminhos e valores não-caminhos.-2

Nem todas as variáveis ​​estão definidas e algumas não são caminhos.

Ao usar variáveis ​​XDG, certifique-se de sempre definir um padrão sensato:

export "${XDG_CACHE_HOME:=$HOME/.cache}"

Isso também definirá a variável (se não estiver definida) e a disponibilizará para quaisquer binários ou scripts que você executar.

As variáveis ​​mais comuns que uso:

export "${XDG_CACHE_HOME:=$HOME/.cache}"       # Semi-temporary data. export "${XDG_CONFIG_HOME:=$HOME/.config}"     # Configuration files. export "${XDG_DATA_HOME:=$HOME/.local/share}"  # Downloaded data, etc.

Existem vários outros, e eu encorajo você a aprendê-los. Você deve usar esses locais em vez de escrever tudo /tmp ou um diretório personalizado em ~/.

Terminal Konsole aberto no laptop Kubuntu Focus Ir14 Linux.
Como obter uma folha de dicas para qualquer comando no terminal Linux

Às vezes, trapacear é necessário.

6
Por Zunaid Ali

Além dessas variáveis, muitas variáveis ​​de ambiente úteis estão disponíveis através do shell. As variáveis ​​cobertas representam aquelas que uso com mais frequência. Eu não poderia escrever scripts Bash sem eles. Por outro lado, os valores codificados eventualmente levarão a quebras. Quando você tem centenas de scripts, essas quebras se tornam um pesadelo de manutenção. Portanto, é melhor inferir o máximo que puder de outro lugar, de preferência a partir de variáveis ​​padrão, e as variáveis ​​apresentadas aqui hoje se enquadram no projeto.

Para encerrar, aprenda e use tantas variáveis ​​padrão quanto possível.

Uma janela de terminal exibindo exemplos de saídas de script Bash, acompanhadas por ícones shell e .sh.
3 técnicas de script Bash que todo usuário Linux deve conhecer

Desbloqueie o poder do Bash com estas técnicas simples.

5
Por Graeme Pavão
Este artigo foi útil?
Gostei0Não Gostei0

Deixe um comentário

Are you sure want to unlock this post?
Unlock left : 0
Are you sure want to cancel subscription?
-
00:00
00:00
Update Required Flash plugin
-
00:00
00:00