Eu configurei uma variável de ambiente e quero usá-la ao chamar um comando, mas sem dados.
O comando completo, sem variável, funciona:
nacho@WouldntYouLikeToKnow ~ % ls -la ~/Downloads
total 8675309
drwx------+ 16 nacho staff 512 Sep 28 10:30 .
drwxr-x---+ 29 nacho staff 928 Sep 29 10:39 ..
Agora eu defino uma variável e tento usá-la, mas ela falha:
nacho@WouldntYouLikeToKnow ~ % export testing="-la ~/Downloads"
nacho@WouldntYouLikeToKnow ~ % ls $testing
ls: invalid option --
usage: ls [-@ABCFGHILOPRSTUWabcdefghiklmnopqrstuvwxy1%,] [--color=when] [-D format] [file ...]
É quase sempre a abordagem errada colocar várias strings separadas (argumentos) em uma única string, pelo menos se você precisar extrair essas strings separadas novamente.
O que você está fazendo funciona no
bash
shell (supondo que você usou$HOME
no lugar de~
, pois o shell não faz expansão de til entre aspas duplas) porque divide a expansão de variável sem aspas nos caracteres de espaço na string (em qualquer caractere em$IFS
; e também aplica globbing de nome de arquivo às palavras geradas), enquanto ozsh
shell não faz isso.Observe que ele só funciona,
bash
pois não há outros caracteres de espaço, tabulação ou nova linha em sua string e já que a string também não contém caracteres globbing de nome de arquivo. Sua abordagem definitivamente não funcionariabash
se o nome do caminho tivesse um espaço nele, por exemplo, ou se você desejasse listar o conteúdo de um diretório chamado*
.A maneira correta de armazenar argumentos de linha de comando separados em uma variável em ambos os shells é usar um array:
ou
No
bash
shell, você usaria isso comoAqui,
"${args[@]}"
expande para uma lista que consiste nos elementos daargs
matriz, cada um citado individualmente.No
zsh
shell, você pode fazer a mesma coisa ou apenas usarAqui, o
zsh
shell expandiria a matrizargs
para separar elementos, cada um se transformando em um argumento parals
, mas não (por padrão) dividiria esses elementos ou aplicaria globbing de nome de arquivo a eles.Esses exemplos também deixam o til sem aspas, permitindo que o shell o expanda para o nome do caminho do diretório inicial do usuário. Essa expansão aconteceria ao atribuir às
args
matrizes, não ao usar o valor.Relacionado: