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
read
está em uma subchave. As variáveisx
ey
são limitadas no escopo para essa subcamada. Acima, adicionamos chaves para que a instruçãodeclare
estivesse 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
declare
não estará mais na mesma sub-sela e os valores dex
ey
nã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
read
está no shell principal e os valores dex
ey
não são perdidos. -
-n 4
limitaread
para 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,
x
ocupa 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.