No início de um script do shell bash, está a seguinte linha:
IFS=$'\n'
Qual é o significado por trás dessa coleção de símbolos?
bash
shell-script
command-line
Abdul Al Hazred
fonte
fonte
IFS=$'\n'
é um basismo (+ outras conchas, use a cotação ANSI-C , para obter soluções alternativas, consulte stackoverflow.com/questions/10748703/…Respostas:
IFS
significa "separador de campo interno". É usado pelo shell para determinar como fazer a divisão de palavras, ou seja, como reconhecer os limites das palavras.Tente isso em um shell como o bash (outros shells podem lidar com isso de maneira diferente, por exemplo, zsh):
O valor padrão para
IFS
consiste em caracteres de espaço em branco (para ser mais preciso: espaço, tabulação e nova linha). Cada caractere pode ser um limite de palavra. Portanto, com o valor padrão deIFS
, o loop acima será impresso:Em outras palavras, o shell pensa que espaço em branco é um limite de palavra.
Agora, tente configurar
IFS=:
antes de executar o loop. Desta vez, o resultado é:Agora, o shell se divide
mystring
em palavras também - mas agora, trata apenas dois pontos como o limite da palavra.O primeiro caractere de
IFS
é especial: é usado para delimitar palavras na saída ao usar a$*
variável especial (exemplo extraído do Advanced Bash Scripting Guide , onde você também pode encontrar mais informações sobre variáveis especiais como essa):Comparado a:
Note-se que em ambos os exemplos, o shell ainda irá tratar todos os personagens
:
,-
e;
como limites de palavra. A única coisa que muda é o comportamento de$*
.Outra coisa importante a saber é como o chamado "espaço em branco do IFS" é tratado . Basicamente, assim que
IFS
inclui caracteres de espaço em branco, os espaços em branco à esquerda e à direita são removidos da sequência a ser dividida antes de processá-la e uma sequência de caracteres consecutivos em branco também delimita os campos. No entanto, isso se aplica apenas aos caracteres de espaço em branco que estão realmente presentes noIFS
.Por exemplo, vejamos a sequência
"a:b:: c d "
(espaço à direita e dois caracteres de espaço entrec
ed
).IFS=:
isso seria dividido em quatro campos:"a"
,"b"
,""
(string vazia) e" c d "
(novamente, dois espaços entrec
ed
). Observe o espaço em branco à esquerda e à direita no último campo.IFS=' :'
, que seria dividido em cinco campos:"a"
,"b"
,""
(string vazia),"c"
e"d"
. Nenhum espaço em branco à esquerda e à esquerda em qualquer lugar.Observe como vários caracteres de espaço em branco consecutivos delimitam dois campos no segundo exemplo, enquanto vários dois pontos consecutivos não o fazem (já que não são caracteres de espaço em branco).
Quanto a
IFS=$'\n'
, que é umaksh93
sintaxe também suportado porbash
,zsh
,mksh
e FreeBSDsh
(com variações entre todas as conchas). Citando a página de manual do bash:\n
é a sequência de escape de uma nova linha e, portanto,IFS
acaba sendo definida como um único caractere de nova linha.fonte
bash
guia de script, ou qualquer outra coisa. Em geral, as informações disponíveis em links como esse estão ausentes de maneiras importantes. De qualquer forma, faltam, portanto, dois pontos cruciais em relação à divisão de shell - globbing e espaço em branco do IFS.unset IFS
shell se comporta de maneira muito diferenteIFS=
. Além disso, o primeiro byte no IFS também é especial"${named_array[*]}"
- mas também não importa quando a expansão não está entre$IFS
é uma das duas principais ações realizadas ao expandir uma variável não citada no contexto da lista (é asplit
parte dosplit+glob
operador). O outro está brilhando. Ao usar a divisão de trabalho, geralmente é necessário emitirset -f
para desativar aglob
peça.$IFS
também é usado peloread
comando embutidoDentro de aspas simples, alguns caracteres são avaliados especialmente. Por exemplo,
\n
é traduzido para nova linha.Portanto, essa linha específica atribui nova linha à variável IFS. O IFS, por sua vez, é uma variável especial no bash: Internal Field Separator. Como
man bash
diz,fonte
dollared single quotes
que é diferente de aspas simples.Para resumir,
IFS=$'\n'
atribua nova linha\n
à variávelIFS
.$'string'
construct é um mecanismo de citação usado para decodificar ANSI C como seqüências de escape. Essa sintaxe vemksh93
, e foi portátil para shell moderno, comobash
,zsh
,pdksh
,busybox sh
.Essa sintaxe não é definida pelo POSIX, mas foi aceita na edição 7 do SUS .
fonte
Eu preferi explicar
$IFS
por exemplo:Suponha que você deseja cp ou mv ou outro processo de arquivo, o IFS está vazio por padrão. Quando seus arquivos têm meta char ou espaço como:
Linux Administration.pdf
ouFree Software Fundation.ogg
, claro, você terá problemas, porque: o Linux considera um param separado e administartion considerar uma festança param.So separado tembuilt-in variable
, então você pode inicializar paraIFS==$(echo -en "\n\b")
, então o bash descartar qualquer caractere meta e espaço entre o nome do arquivo, por exemplo:fonte