Funciona muito bem:
$ IFS=,; echo ' a b,c d' | { read x y; declare -p x y;}
declare -- x=" a b"
declare -- y="c d"
Notas
-
Como está em um pipeline, a instrução
readestá em uma subchave. As variáveisxeysão limitadas no escopo para essa subcamada. Acima, adicionamos chaves para que a instruçãodeclareestivesse no mesmo subshell que a instruçãoread. Dessa forma, a saída declare mostra os valores de x e y que foram lidos.Se removermos as chaves, a instrução
declarenão estará mais na mesma sub-sela e os valores dexeynão serão preservados. Observe:$ x=hot; y=cold; IFS=,; echo ' a b,c d' | read -n 4 x y; declare -p x y declare -- x="hot" declare -- y="cold" -
Para evitar o limite de subshell, podemos usar uma string here:
$ IFS=,; read x y <<<' a b,c d'; declare -p x y declare -- x=" a b" declare -- y="c d"Com uma string here, a instrução
readestá no shell principal e os valores dexeynão são perdidos. -
-n 4limitareadpara 4 caracteres. Isso provavelmente não é o que você queria. Observe:$ IFS=,; echo ' a b,c d' | { read -n 4 x y; declare -p x y;} declare -- x=" a b" declare -- y=""Aqui,
xocupa todos os 4 caracteres (os espaços em branco contam como caracteres), não há caracteres lidos paray. -
Como PesaThe , também é possível atribuir variáveis de shell localmente apenas para a execução de um comando. Como as alterações no IFS podem causar efeitos colaterais indesejados nos comandos subseqüentes, é uma boa ideia aqui. Assim:
$ IFS=, read x y <<<' a b,c d'; declare -p x y declare -- x=" a b" declare -- y="c d"Após o comando acima ser executado,
IFSé retornado ao seu valor anterior.