Globbing ocorre apenas em contextos de lista, então você precisa atribuir a uma variável array . Com ksh93
, bash
, zsh
, mksh
ou yash
:
the_files=(~/downloads/stack-*-linux-x86_64-static.tar.gz)
Ou em sh
:
set -- ~/downloads/stack-*-linux-x86_64-static.tar.gz
para atribuir a $1
, $2
...
E para obter o primeiro elemento: "${the_files[1]}"
em zsh
ou yash
(ou apenas $the_files[1]
em zsh
) ou "${the_files[0]}"
em ksh
ou bash
.
Para todos os elementos: "${the_files[@]}"
(também $the_files
in zsh
).
Para a concatenação dos elementos associados ao primeiro caractere de $IFS
: "${the_files[*]}"
(também "$the_files"
com zsh
). Ou juntou-se a qualquer string em zsh
: ${(j:, :)the_files}
(aqui associada a ,
).
Mais algumas notas
Atribuição a variáveis escalares
the_file=~/downloads/stack-*-linux-x86_64-static.tar.gz
O ~
seria expandido, mas não o glob. No entanto, se você esqueceu de usar aspas ao expandir a variável, como em:
printf '%s\n' $the_file # instead of printf '%s\n' "$the_file"
Em seguida, o conteúdo de $the_file
estaria sujeito à divisão + glob e expandido nesse ponto , o que poderia fazer você pensar que funciona, mas na verdade não combina com a expansão do til pode até ficar mais confuso.
Por exemplo, se $HOME
for /All * Users/me
e $IFS
estiver definido como seu valor padrão, $the_file
conterá /All * Users/me/downloads/stack-*-linux-x86_64-static.tar.gz
e printf
imprimirá /All
, seguido de todos os nomes de arquivo em o diretório atual (a expansão de *
), seguido pela expansão de Users/me/downloads/stack-*-linux-x86_64-static.tar.gz
.
E se o padrão não corresponder a nenhum arquivo
Em zsh
, você recebe um erro, mas em outros shells, o padrão é deixado intacto. Melhor aqui seria o padrão se expandir para nada.
Com zsh
, isso é com o qualificador N
glob:
the_files=(~/downloads/stack-*-linux-x86_64-static.tar.gz(N))
ksh93
tem um recurso semelhante ao seu operador ~(N)
glob:
the_files=(~/downloads/~(N)stack-*-linux-x86_64-static.tar.gz)
Para outros shells, você precisa ativar alguma opção global em ( shopt -s nullglob
in bash
, set -o nullglob
in yash
).