Ver algo que me faz questionar minha sanidade:
#!/bin/env bash
set -e
for d in '/tmp/somedir/*'; do
for f in "${d}/*pub"; do
echo $f;
done
done
retorna como esperado
/tmp/somedir/AAA/fileaa.pub /tmp/somedir/BBB/filebb.pub
Mas, se eu mudar echo $f
para echo "$f"
ou echo "${f}"
eu obtiver:
/tmp/somedir/*/*pub
E estou tendo dificuldade em entender o porquê. Para começar, é um item único, então não é algo que está afetando apenas a echo
linha.
usandoGNU bash, version 5.2.37(1)-release (x86_64-pc-linux-gnu)
aqui estão as lojas naquele host
assoc_expand_once off
cdable_vars off
cdspell off
checkhash off
checkjobs off
checkwinsize on
cmdhist on
compat31 off
compat32 off
compat40 off
compat41 off
compat42 off
compat43 off
compat44 off
complete_fullquote on
direxpand off
dirspell off
dotglob off
execfail off
expand_aliases on
extdebug off
extglob on
extquote on
failglob off
force_fignore on
globasciiranges on
globskipdots on
globstar off
gnu_errfmt off
histappend on
histreedit off
histverify off
hostcomplete off
huponexit off
inherit_errexit off
interactive_comments on
lastpipe off
lithist off
localvar_inherit off
localvar_unset off
login_shell off
mailwarn off
no_empty_cmd_completion off
nocaseglob off
nocasematch off
noexpand_translation off
nullglob off
patsub_replacement on
progcomp on
progcomp_alias off
promptvars on
restricted_shell off
shift_verbose off
sourcepath on
varredir_close off
xpg_echo off
Após corrigir o script:
Normalmente, NÃO devemos citar
*
ou?
no loop. Dessa forma, o Bash os expandirá para corresponder a cada nome de arquivo, e o loop for se comportará conforme o esperado.