Eu tenho um script 'myscript' que gera o seguinte:
abc
def
ghi
em outro script, eu chamo:
declare RESULT=$(./myscript)
e $RESULT
obtém o valor
abc def ghi
Existe uma maneira de armazenar o resultado com as novas linhas ou com o caractere '\ n' para que eu possa imprimi-lo com ' echo -e
'?
Respostas:
Na verdade, o RESULT contém o que você deseja - para demonstrar:
O que você mostra é o que obtém:
Como observado nos comentários, a diferença é que (1) a versão com aspas duplas da variável (
echo "$RESULT"
) preserva o espaçamento interno do valor exatamente como é representado na variável - novas linhas, guias, vários espaços em branco e tudo - enquanto (2 ) a versão não citada (echo $RESULT
) substitui cada sequência de um ou mais espaços em branco, guias e novas linhas por um único espaço. Assim (1) preserva a forma da variável de entrada, enquanto (2) cria uma linha única de saída potencialmente muito longa com 'palavras' separadas por espaços únicos (onde uma 'palavra' é uma sequência de caracteres que não são espaços em branco; qualquer alfanumérico em qualquer uma das palavras).fonte
Outra armadilha com isso é que o comando substituição -
$()
- rastreia as novas linhas. Provavelmente nem sempre é importante, mas se você realmente deseja preservar exatamente o que foi produzido, precisará usar outra linha e algumas citações:Isso é especialmente importante se você deseja manipular todos os nomes de arquivos possíveis (para evitar comportamentos indefinidos, como operar no arquivo errado).
fonte
pwd=`pwd`; ls $pwd/$file
, você terá uma nova linha antes da/
, e colocar o nome entre aspas duplas não ajudará. Foi consertado rapidamente. Isso foi em 1983-5, no ICL Perq PNX; o shell não tinha$PWD
como variável interna.Caso você esteja interessado em linhas específicas, use uma matriz de resultados:
fonte
readarray
e processo de substituição em vez de substituição de comando:readarray -t RESULT < <(./myscript>
.Além da resposta dada por @ l0b0, eu apenas tive a situação em que eu precisava manter qualquer linha de saída final do script e verificar o código de retorno do script. E o problema com a resposta de l0b0 é que o 'eco x' estava redefinindo $? de volta a zero ... então eu consegui encontrar essa solução muito esperta:
fonte
die ()
função que aceite um código de saída arbitrário e, opcionalmente, uma mensagem, e eu queria usar outrausage ()
função para fornecer a mensagem, mas as novas linhas continuavam sendo esmagadas, espero que isso me permita contornar isso.Depois de tentar a maioria das soluções aqui, a coisa mais fácil que encontrei foi o óbvio - usando um arquivo temporário. Não sei ao certo o que você deseja fazer com sua saída de várias linhas, mas você pode lidar com isso linha por linha usando a leitura. A única coisa que você realmente não pode fazer é colocá-lo facilmente na mesma variável, mas para os propósitos mais práticos, é muito mais fácil lidar com isso.
Corte rápido para fazer a ação solicitada:
Observe que isso adiciona uma linha extra. Se você trabalha com isso, pode codificar, sou muito preguiçoso.
EDIT: Embora este caso funcione perfeitamente bem, as pessoas que estiverem lendo isso devem estar cientes de que você pode compactar facilmente seu stdin dentro do loop while, fornecendo um script que executará uma linha, limpará stdin e sairá. Como ssh vai fazer o que eu acho? Eu vi recentemente, outros exemplos de código aqui: /unix/24260/reading-lines-from-a-file-with-bash-for-vs- while
Mais uma vez! Desta vez, com um manipulador de arquivo diferente (stdin, stdout, stderr são 0-2, para que possamos usar & 3 ou superior no bash).
você também pode usar o mktemp, mas este é apenas um exemplo de código rápido. O uso do mktemp se parece com:
Em seguida, use $ filenamevar como se fosse o nome real de um arquivo. Provavelmente não precisa ser explicado aqui, mas alguém se queixou nos comentários.
fonte
bash
armadilhas comuns .read
extensão de comando-u 3
para ler do descritor de arquivo 3.Que tal isso, ele lerá cada linha em uma variável e poderá ser usada posteriormente! digamos que a saída myscript é redirecionada para um arquivo chamado myscript_output
fonte