$ ls a b c d $ rm $(except b d) $ ls b d
Isso não pode funcionar, pelo menos não de forma confiável, porque "except"
não pode decidir como o shell irá dividir (e expandir ainda mais) sua saída antes de passá-lo para o comando rm
.
Para responder à sua pergunta, o printf não usa $IFS
. O único comando que usa o IFS é read
. Além disso, o $ IFS é usado pelo shell para dividir palavras e unir os argumentos posicionais em "$*"
.
Você provavelmente quer:
printf '%s ' $matches
Ou
printf '%s\n' $matches
Mas, novamente, em
rm $(except a b)
O shell que interpreta essa linha de comando dividirá a saída de except
de acordo com seu próprio $IFS
(por espaço padrão, tabulação ou nova linha, é por isso que usar espaço ou \n
acima não faz diferença) e também expandir os curingas para lá.
Portanto, se os arquivos diferentes de a
e b
forem "this file.txt"
e **a**
, except
produzirá "this file.txt **a** "
e você acabará tentando remover this
, file.txt
e a
(pois **a**
expandirá para todos os arquivos com a
em seu nome).
Se você deseja unir as correspondências com espaços sem o espaço à direita, faça o seguinte:
IFS=
set -- $matches
IFS=' '
matches="$*"