Atribua o nome do arquivo a uma variável usando a expansão do nome do caminho

6

Existe uma maneira confiável de atribuir um nome de arquivo a uma variável aproveitando a expansão do nome do caminho?

Isso funciona, mas parece um pouco desonesto:

the_file="$(echo ~/downloads/stack-*-linux-x86_64-static.tar.gz)"

Se o arquivo existir, seu caminho completo será atribuído a $the_file , caso contrário, um padrão de globalização falso tomará o lugar.

    
por undostres 26.12.2016 / 19:20

1 resposta

4

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 ).

    
por 26.12.2016 / 22:41