shell - temp IFS apenas como nova linha. Por que isso não funciona: IFS = $ (echo -e '\ n')

Estou tentando usarfor no shell para iterar sobre nomes de arquivos com espaços. Eu li em umpergunta stackoverflow naquelaIFS=$'\n' poderia ser usado e parece funcionar bem. Então eu liem um comentário para uma das respostas que para torná-lo posix compatível para outras conchas além de bash poderia usarIFS=$(echo -e '\n').

O primeiro funciona, mas o segundo não. O comentário é promovido várias vezes. Eu verifiquei a saída e a variável não parece conter a nova linha.

#!/bin/sh

IFS=$(echo -e '\n')
echo -n "$IFS" | od -t x1
for file in `printf 'one\ntwo two\nthree'`; do
    echo "Found $file"
done

echo

IFS=


A saída mostra que o separador de campo está ausente no primeiro:

0000000
Found one
two two
three


Mas é apropriado no segundo:

0000000 0a
0000001
Found one
Found two two
Found three


Eu encontrei uma pergunta respondida que pode ou não ser uma duplicata da minha pergunta:
linux - Ao configurar o IFS para dividir em novas linhas, por que é necessário incluir um backspace? - estouro de pilha

Existe algum perigo em fazer o que é discutido lá,IFS=$(echo -en '\n\b')? Porque isso adiciona um\b para IFS (eu verifiquei). Pode um\b ocorrer em um nome de arquivo? Não quero que meu código divida um nome de arquivo por engano.

Você também tem alguma recomendação sobre como tratar adequadamente a restauração do IFS após afor loop? Devo armazená-lo em uma variável temporária ou executar o IFS e a instrução for em um subshell? (e como fazer isso?) Obrigado

\n' echo -n "$IFS" | od -t x1 for file in `printf 'one\ntwo two\nthree'`; do echo "Found $file" done


A saída mostra que o separador de campo está ausente no primeiro:

0000000
Found one
two two
three


Mas é apropriado no segundo:

0000000 0a
0000001
Found one
Found two two
Found three


Eu encontrei uma pergunta respondida que pode ou não ser uma duplicata da minha pergunta:
linux - Ao configurar o IFS para dividir em novas linhas, por que é necessário incluir um backspace? - estouro de pilha

Existe algum perigo em fazer o que é discutido lá,IFS=$(echo -en '\n\b')? Porque isso adiciona um\b para IFS (eu verifiquei). Pode um\b ocorrer em um nome de arquivo? Não quero que meu código divida um nome de arquivo por engano.

Você também tem alguma recomendação sobre como tratar adequadamente a restauração do IFS após afor loop? Devo armazená-lo em uma variável temporária ou executar o IFS e a instrução for em um subshell? (e como fazer isso?) Obrigado

questionAnswers(2)

yourAnswerToTheQuestion