Em um shell interativo, por que alguém configuraria o IFS para algo diferente do padrão?

3

Às vezes, ao escrever script, pode ser necessário definir IFS (o separador de campo interno) como algo diferente do padrão, por exemplo para mudar o caminho $* será expandido.

Embora isso seja totalmente plausível, não consigo pensar em nenhum motivo para definir IFS em shells interativos para nada além do padrão (que é space, tab e newline se bem me lembro). Ainda me disseram muitas vezes que em um shell interativo não posso esperar que IFS seja definido como seu valor padrão.

Isso é realmente verdade? Alguém pode dar exemplos práticos?

    
por helpermethod 27.02.2013 / 15:28

2 respostas

7

Em um shell interativo, $IFS será o padrão, a menos que você o altere ou algo em scripts de inicialização do shell (como ~/.bashrc para bash ) ou quaisquer outros scripts originados ou funções shell executadas desde que o shell foi iniciado eles (geralmente não mudariam de volta para o padrão se estivessem escritos corretamente).

Se as funções definidas em arquivos rc ou outros arquivos originados forem escritas corretamente e precisarem usar a divisão de palavras, elas não assumirão nada sobre o valor atual do IFS , por isso deve ser bom para você configurá-lo para um valor diferente.

No entanto, depois de alterá-lo, é preciso lembrar que você fez isso, pois isso pode afetar o modo como as linhas de comando executadas posteriormente são interpretadas.

Por exemplo, se você fizer isso:

IFS=:; ls -- $PATH

Para listar os diretórios em $PATH , você pode se perguntar por que mais tarde coisas como:

rm -f -- $(cat ~/my.file.list)

não funciona mais. Então você também pode escrever:

(IFS=:; ls -- $PATH)

Ou:

IFS=:; ls -- $PATH; unset IFS

(BTW, unset IFS restaura a divisão da palavra para seu comportamento padrão, mas não $IFS e quebra as funções (não escritas corretamente) que fazem coisas como oldIFS=$IFS; IFS=xxx; ...; IFS=$oldIFS para restaurar $IFS ).

    
por 27.02.2013 / 17:14
1

É claro que você pode e deve esperar que IFS esteja definido como padrão, pois sem ele todos os tipos de comandos simplesmente deixarão de funcionar completamente.

Você altera o IFS em um shell (temporariamente) pelas mesmas razões que você faz em um script bash, quando você precisa dele (o que raramente acontece). Se você for usar um comando específico apenas uma vez, não há motivo para escrevê-lo em um script de shell. Além disso, não há diferença entre um script de shell e o uso do shell diretamente.

    
por 27.02.2013 / 16:15

Tags