Execute o Ubuntu 24.04 LTS se isso fizer alguma diferença.
Estou tentando exibir o resultado de dois comandos em um script bash (a saída é para stdout) em uma única linha, mas não consigo fazer funcionar - recebo as duas saídas em duas linhas.
O comando que tentei (e muitas variações dele) é:
ssh [email protected] -- 'echo -n "VMName : " && lsblk | grep -i disk' && 'echo -n " Hypervisor = HypervisorHostName"'
Isso gera duas linhas como esta:
Nome da VM: vda 254:0 0 20G 0 disco
Hipervisor = HypervisorHostName
enquanto eu gostaria de obter:
VMName: vda 254:0 0 20G 0 disco Hypervisor = HypervisorHostName
Suspeito que seja trivialmente fácil. Estou perdendo o óbvio aqui?
Obrigado,
Alan.
Observe que a parte da sua linha de comando que está depois do
&&
ie finalecho -n " Hypervisor = HypervisorHostName"
será executada na máquina local de onde você estássh
fazendo o download apósssh
o fechamento da sessão e não será executada na máquina remota ou durante assh
sessão... No seu casossh
, são passados apenas os comandos entre o primeiro conjunto de aspas simples'...'
.Dito isso, você parece lidar principalmente com strings sobre as quais você aparentemente teria controle total sobre como elas seriam impressas, exceto pela
lsblk | grep -i disk
parte ondegrep
decide que... Eu estava pensando por que não transformar isso também em uma string usando a sintaxe de substituição de comando$(...)
e então formatar tudo como uma string usando o built-in do shellprintf
com seu especificador de string%s
assim:Em geral, você pode canalizar a saída padrão para
paste -s
concatenar pares de linhas.Entretanto, neste caso, eu sugeriria usar
awk
em vez degrep
para que você possa imprimir a saída formatada que deseja diretamente, por exemplo:Você pode omitir
IGNORECASE=1
e usar qualquer POSIXawk
se realmente não precisar de correspondência que não diferencie maiúsculas de minúsculas.Alternativamente, você pode ir até o fim e usar a
lsblk
saída JSON do comando e selecionar o disco e imprimir a string desejada usandojq
- o que protegeria contra correspondências falsas da string "disco" em outro lugar na saída - por exemploou
(Omiti alguns campos que
."maj:min"
provavelmente não são de interesse).Um conjunto de coisas simples que podem fazer você começar:
www.tldp.org tem "guias Bash" em PDFs - eu recomendo dar uma olhada rápida para talvez pegar um truque ou dois.
Com isso você sabe o que há, e pode procurar pesquisando.
Por favor, experimente isto:
por favor nos avise se isso alcança o que você procura :-)
adendo: como Terdon aponta, eu acidentalmente usei & em vez de &&. Como um bônus adicional, && obtém a ordem correta da esquerda para a direita:
Isso é amaldiçoado, mas funciona até que não funcione mais e serve como seu próprio explicativo no último caso:
Melhor ainda como uma solução paliativa claramente visível, ela realmente funciona com a sintaxe:
Caso começar a linha sem o ### não tenha sido explícito o suficiente.