Pipe atribui variável

15

Para simplificar, gostaria de fazer:

echo cart | assign spo;
echo $spo  

Saída: carrinho

Existe tal aplicação assign ?

Estou ciente de todas as maneiras de fazer isso usando a substituição.

    
por Prospero 08.11.2013 / 18:52

5 respostas

10
echo cart | { IFS= read -r spo; printf '%s\n' "$spo"; }

Funcionaria (armazena a saída de echo sem o caractere de nova linha à direita na variável spo ), contanto que echo produza apenas uma linha.

Você sempre pode fazer:

assign() {
  eval "$1=\$(cat; echo .); $1=\${$1%.}"
}
assign spo < <(echo cart)

As soluções a seguir funcionariam em bash scripts, mas não no prompt bash :

shopt -s lastpipe
echo cat | assign spo

Ou:

shopt -s lastpipe
whatever | IFS= read -rd '' spo

Para armazenar a saída de whatever até os primeiros caracteres NUL ( bash variables não podem armazenar caracteres NUL) em $spo .

Ou:

shopt -s lastpipe
whatever | readarray -t spo

para armazenar a saída de whatever na matriz $spo (uma linha por elemento da matriz).

    
por 09.11.2013 / 22:19
13

Você pode fazer algo assim, se usar bash :

echo cart | while read spo; do echo $spo; done

Infelizmente, a variável "spo" não existirá fora do loop while-do-done. Se você conseguir fazer o que quiser dentro do loop while, isso funcionará.

Você pode fazer quase exatamente o que você escreveu acima em ATT ksh (não em pdksh ou mksh) ou no fabuloso zsh:

% echo cart | read spo
% echo $spo
cart

Então, outra solução seria usar ksh ou zsh.

    
por 08.11.2013 / 19:01
1

Se você quiser apenas enviar o fluxo de tubos atual, use cat .

echo cart | cat 

Se você quiser continuar com sua cadeia de comandos, tente usar o comando tee para fazer o eco da saída.

echo cart | tee /dev/tty | xargs ls

Você pode usar um alias para encurtar o comando.

alias tout='tee /dev/tty'
echo cart | tout | xargs ls
    
por 09.11.2013 / 15:08
1

Aqui está a minha solução para o problema.

# assign will take last line of stdout and create an environment variable from it
# notes: a.) we avoid functions so that we can write to the current environment
#        b.) aliases don't take arguments, but we write this so that the "argument" appears
#            behind the alias, making it appear as though it is taking one, which in turn
#            becomes an actual argument into the temporary script T2.
# example: echo hello world | assign x && echo %x outputs "hello world"
alias assign="tail -1|tee _T1>/dev/null&&printf \"export \\=\$(cat _T1)\nrm _T*\">_T2&&. _T2"
    
por 27.07.2017 / 00:12
0

Se eu entendi o problema corretamente, você quer canalizar stdout para uma variável. Pelo menos era o que eu estava procurando e acabei aqui. Então, para aqueles que compartilham meu destino:

spa=$(echo cart)

Atribui cart à variável $spa .

    
por 30.09.2015 / 21:57

Tags