Armazena saída de comando na variável quando o comando inclui pipes

4

Como faço para armazenar a saída de um comando em uma variável? Aqui está o que estou fazendo, mas nada está sendo armazenado. Parece que canos são o problema, mas eu não sei como proceder com a depuração.

Isso funciona como esperado:

$ var=$(printf "hello \n world")
$ echo $var
hello world

Como isso:

$ printf "hello \n world" | wc -l
1

Isso não:

$ var=$(printf "hello \n world" | wc -l)
$ echo $var

$ #previous command returns nothing

Como obtenho var para armazenar 1 no terceiro exemplo?

Editar: Usando o bash, no Cygwin.

Editar 2: em execução com bash -x

$ bash -x
+ [[ -z '' ]]
+ CYG_SYS_BASHRC=1
+ [[ himxBH != *i* ]]
+ export 'EXECIGNORE=*.dll'
+ EXECIGNORE='*.dll'
+ PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '
+ [[ himxBH != *i* ]]

$ var=$(printf "hello \n world" | wc -l)
+ var=

$ echo $var
+ echo

Editar 3:

$ bash --version
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

Editar 4: set +o posix como sugerido por @GeorgeVasiliou em um comentário sobre minha resposta (agora excluído pelo moderador e copiado abaixo) não altera a saída.

Por algum motivo, a sintaxe de backtick funciona para mim, mas não a sintaxe $(...)

$ var='printf "hello \n world" | wc -l'
++ printf 'hello \n world'
++ wc -l
+ var=1

$ echo $var
+ echo 1
1

Se alguém puder explicar por que isso acontece e, mais importante, como corrigi-lo, essa deve ser a resposta aceita.

    
por dkv 13.05.2017 / 00:51

1 resposta

2

[editado para adicionar o resumo de links conforme sugerido] Tem a ver com o fato de que você está usando o Cygwin com certos softwares que fazem com que ele se comporte estranhamente no Windows. A lista de softwares problemáticos é chamada BLODA. Confira os links abaixo para mais informações:

O primeiro link é a definição oficial do Cygwin de BLODA. Software, geralmente do tipo antivírus, que implementa vários ganchos, como quando um processo executa fork () ou acessa arquivos ou até mesmo áreas de memória. Esse tipo de software impede que o Cygwin e o bash se comportem corretamente e a solução seria desabilitar a varredura, adicionando uma exceção ao diretório de instalação do Cygwin ou desabilitando / desinstalando completamente o software.

O segundo link aponta para um problema na lista de discussão que se manifesta exatamente como o autor desta postagem descreve e alguém responde a essa questão apontando para a seção BLODA da FAQ do Cygwin.

    
por 25.02.2018 / 22:45