por que não precisamos exportar aqui?

1
$ IFS=";"

$ read first second 
i am;a_i b c
$ echo $first
i am
$ echo $second
a_i b c

$ echo $IFS
  1. Estou certo de que read first second é um subprocesso do atual processo de shell? Se sim, por que não precisamos de export IFS=";" ?
  2. por que IFS está vazio?
por Tim 30.08.2014 / 23:13

4 respostas

5

Am I right that read first second is a subprocess of the current shell process? If yes, why don't we need export IFS=";"?

Não, read é uma função de bultin bash . Nenhum subshell ou subprocesso é criado aqui, portanto, não é necessário exportar IFS .

why is IFS empty?

Porque você não usa aspas duplas. Você alterou o valor do IFS para ; , portanto, quando você echo $IFS , após $IFS ser expandido para ; , o shell executa spliting e globbing de palavras, com ; como separador. Então nada é impresso.

Tente:

$ IFS=";"
$ printf "%s\n" $IFS

$ printf "%s\n" "$IFS"
;

Nota

por 30.08.2014 / 23:26
1

Se digitarmos type read , obteremos read is a shell builtin . Portanto, não é executado como um subprocesso.

    
por 30.08.2014 / 23:27
1

Em resposta a porque o IFS está vazio. Não é. Mas o valor em IFS está mudando o comportamento do shell. Abaixo não há uma explicação, mas apenas o resultado de minhas experiências usando o bash no Debian Gnu + Linux.

a=";"; echo $a produz ; .

IFS=";"; echo $IFS produz linha em branco. IFS=";"; echo "$IFS" produz ; .

Agora, a=";"; echo $a produz linha em branco, mas IFS=" "; a=";"; echo $a produz ; novamente.

Então

Agora, IFS=";"; a=";"; echo $a produz uma linha em branco, mas IFS=" "; a=";"; echo $a produz ; .

Portanto, o valor do IFS altera o comportamento (aspas não usadas no eco).

    
por 30.08.2014 / 23:47
1
IFS=\;; set -- $IFS; echo $#; echo "$*"

1
;

IFS=; set -- $IFS; echo $#; echo "$*"

0
#there doesn't seem to be anything here

Como você pode ver - $IFS não está vazio no primeiro caso - contém exatamente um separador de campo.

Quando o shell expande uma variável sem aspas, ele divide seu valor nos delimitadores definidos em $IFS . Dessa forma, cada variável é, potencialmente, uma matriz $IFS separada. Por padrão, $IFS está definido como% e-line <space> , \t ab e \n . Cada uma delas tem qualidades especiais em $IFS , pois elas são $IFS espaço em branco . Os delimitadores $IFS whitespace não são retidos e cada seqüência de qualquer um deles é truncada em um único campo quando o shell executa as palavras, enquanto todos os outros delimitarão um único campo por separador. $IFS whitespace também será totalmente removido do início ou do fim de um campo. Por exemplo:

IFS=/; slashes=///////; printf '<%s>' $slashes
<><><><><><><>

IFS=' '; spaces='      '; printf '<%s>' $spaces
<>

printf '<%s>' $spaces$slashes
<///////>

Mas $IFS espaço em branco é obviamente não removido quando não é em $IFS :

IFS=/; printf '<%s>' $spaces$slashes
<      ><><><><><><>
    
por 31.08.2014 / 04:54