(...)
introduz um subshell. Então $URL
não seria definido depois disso (ainda tem o valor que tinha antes da subcamada). Você quer:
IFS=-
read -r -a host_name_array <<< "$(hostname)"
unset 'host_name_array[${#host_name_array[@]}-1]'
URL="${host_name_array[*]}"
"${host_name_array[*]}"
une os elementos nas matrizes no primeiro caractere de $IFS
, da mesma forma que "$*"
faz no padrão sh
.
Se o motivo pelo qual você está usando um subshell é porque não deseja modificar o $IFS
globalmente, é possível fazer isso em uma função em que você atribui $IFS
um escopo local:
f() {
local IFS=-
...
}
f
Ou use a substituição de comando que também cria um subshell, mas permite passar dados ao shell pai:
URL=$(IFS=-; printf '%s\n' "${host_name_array[*]}")
Aqui, eu usaria a expansão sh
padrão para remover esse componente final:
URL=$(uname -n) # uname -n is the standard equivalent of hostname
URL=${URL%-*}
Tem várias vantagens em relação ao acima:
- funciona mesmo que o texto contenha caracteres de nova linha (muito improvável para nomes de host aqui);
- se o texto não contiver
-
, ele não removerá nada;
- é mais eficiente.
read <<< $(hostname)
significa executar hostname
, ler sua saída por meio de um canal, armazená-lo em um arquivo temporário e ter read
lendo a primeira linha dele;
- não atrapalha o namespace da variável com essas variáveis temporárias
- é mais curto;
- é portátil. Não é necessário instalar
bash
para executar esse código. O sh
do sistema será suficiente.
Em qualquer caso, lembre-se de citar suas variáveis ao usá-las em contextos de lista:
printf '%s\n' "$URL"
Ao fazer:
echo $URL
Você está invocando o operador split + glob. Assim, se $IFS
ainda contiver -
, esse $URL
seria dividido em -
e echo
produziria essas palavras separadas por espaços.