Variáveis de 'read' no script bash são indefinidas

0

Eu tenho este script bash que eu uso com i3wm para alternar entre os modos de tela (tela externa, tela interna, tudo ou espelho). A primeira parte do script pega o nome das telas. Se eu copiar a parte seguinte e executar em um terminal:

#!/bin/bash

xrandr|grep " connected primary"|IFS=" " read INTERNAL_OUTPUT con
xrandr|awk '/ connected/ && !/ primary/'|IFS=" " read EXTERNAL_OUTPUT con
echo internal monitor is $INTERNAL_OUTPUT
echo external monitor is $EXTERNAL_OUTPUT

...

Eu recebo algo como

$ ./script.sh
internal monitor is eDPI
external monitor is DPI-1

Mas quando eu executo o script, as variáveis estão vazias e tudo que vejo é

$ ./script.sh
internal monitor is 
external monitor is 

Qual é a diferença ao definir as variáveis dentro de um script?

    
por ecc 11.09.2017 / 13:06

1 resposta

2

Você não pode definir variáveis em um pipeline e ter o valor disponível fora do pipe. Ao executar um pipeline, cada parte executa seu próprio subshell, portanto, o comando read está em sua própria sub-shell. Um subshell não pode modificar o ambiente do pai, então as variáveis que você definiu não estão disponíveis para o pai.

Para contornar isso, você poderia fazer como @AFH diz e alterar o comando para que somente o que você deseja seja impresso e então atribuir isso a uma variável no shell pai.

Como alternativa, você poderia reestruturar os comandos para não estar lendo. Eu preferiria a abordagem do AFH, mas a reordenação poderia parecer:

IFS=" " read INTERNAL_OUTPUT con < <(xrandr|grep " connected primary")

onde redirecionamos a entrada de read para uma substituição de processo que faz o resto do comando, então read ainda está no shell pai.

    
por 11.09.2017 / 14:35