Definir valor a uma variável fora do subshell (pipe |) [RESOLVIDO]

1. Definir valor a uma variável fora do subshell (pipe |) [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 02/11/2016 - 14:42h

gostaria de saber como faço para atribuir um valor a uma variável que se encontra fora do subshell criado pelo comando pipe (|)?

como as variáveis que se encontram no interior de um subshell são "zeradas" ao seu término, preciso então criar uma variável que possa receber um valor mesmo quando esse subschell terminar.

por exemplo:

ls *.pdf | while read i
do
iall+=$i" "
echo iall: $iall #exibe corretamente o valor da variável
done
echo iall: $iall #não exibe o valor da variável (pq o pipe fez o while rodar em um subshell, zerando as variáveis ao seu término


o mesmo ocorre por exemplo:

for i in *.pdf
do
iall+=$i" "
echo iall: $iall #exibe corretamente o valor da variável
done | sort
echo iall: $iall #não exibe o valor da variável (pq o pipe fez o while rodar em um subshell, zerando as variáveis ao seu término


o que preciso então é definir algum tipo de variável que eu possa atribuir um valor de dentro do subshell para q o valor permaneça nessa variável mesmo depois de terminado o subshell.

por exemplo, algo neste sentido...

iall="" #definir esta variável de alguma forma que seja acessível de dentro do laço while
ls *.pdf | while read i
do
iall+=$i" " #por enquanto o while está criando uma nova variável iall e não definindo o iall de fora do laço (é aqui que preciso encontrar uma solução p q seja definida o iall de fora do laço...)
echo iall: $iall #exibe corretamente o valor da variável
done
echo iall: $iall #não exibe o valor da variável (pq o pipe fez o while rodar em um subshell, zerando as variáveis ao seu término




  


2. Re: Definir valor a uma variável fora do subshell (pipe |) [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 02/11/2016 - 17:56h

msoliver, do ponto de vista prático sua sugestão resolve o problema.

no entanto, gostaria de uma solução um pouco mais "limpa", sem a necessidade de uma "gambirra" pela criação de um arquivo temporário...

agradeço e fico no aguardo de novas sugestões.


3. Re: Definir valor a uma variável fora do subshell (pipe |)

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 02/11/2016 - 18:29h

raserafim escreveu:

msoliver, do ponto de vista prático sua sugestão resolve o problema.

no entanto, gostaria de uma solução um pouco mais "limpa", sem a necessidade de uma "gambirra" pela criação de um arquivo temporário...

agradeço e fico no aguardo de novas sugestões.


===========================
Sinceramente . . .
Gambiarra, ao meu ver, é isso:
ls *.pdf | while read i . . .
E, acima de tudo, não fornece o resultado esperado!!!!
Se arquivo TEMPORáRIO é GAMBIARRA.....
O que será do LINUX, tem UMA pasta "tmp"!!!!!!
Pois bem, essa é a sua opinião!!!!
mso


4. Re: Definir valor a uma variável fora do subshell (pipe |) [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 02/11/2016 - 18:58h

Pode ser que antes de criar a variável, se for usado

export VARIAVEL

sem o sinal $ em shell original que criará shell subprocesso poderá dar certo.

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



5. Re: Definir valor a uma variável fora do subshell (pipe |) [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 02/11/2016 - 22:37h

msoliver, vc tem toda razão!

foi um exagero de minha parte (e provavelmente um equívoco) dizer q utilizar um arquivo temporário é uma "gambiarra"


6. Re: Definir valor a uma variável fora do subshell (pipe |) [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 02/11/2016 - 22:40h

Listeiro, já tentei utilizar o comando export para criar uma variável global. mas não deu certo.

quando tento atribuir um valor a esta variável no interior do laço é como se fosse criado uma nova variável só p o laço.

a menos que tenha alguma forma em específico para definir o valor de uma variável global...e eu não sei..


7. Re: Definir valor a uma variável fora do subshell (pipe |) [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 02/11/2016 - 23:17h

Pode ser feito colocando a informação temporária em um arquivo de texto.
Morimoto usava muito isto de arquivo temporário.
Algo como arquivo.txt.$$ cuja extensão é o número do processo.
Ou em um tipo de arquivo temporário que não me lembro o nome, fifo ou pipe.

Ou com uma gambiarra colocando o valor da variável junto com a saída processada marcada por uma TAG.
A informação da TAG é lida com grep e removida com sed.

SAIDA=$(ls | while read i; do echo $i; done; echo TAG minha saida)
VALOR_NECESSITADO=$(echo $SAIDA | grep ^TAG)
NOVA_SAIDA=$(echo $SAIDA | sed /^TAG/d)

é mais ou menos isto e assim pode dar certo, mas é uma gambiarra ai ai ai ...

tenho outras destas no meu repertório.

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



8. Re: Definir valor a uma variável fora do subshell (pipe |) [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 03/11/2016 - 13:46h

msoliver e Listeiro obrigado pelas sugestões.

acabei utilizando o esquema do arquivo temporário mesmo!

uma solução que, embora não fosse a que eu esperava, acabou me abrindo para outras soluções.

meu código diminuiu uns 40%

tem "gambiarra" (se é que assim podemos a chamar) que vale muito a pena!

:)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts