如果有所不同,则运行 Ubuntu 24.04 LTS。
我试图在 bash 脚本中将两个命令的结果(输出到 stdout)输出到一行上,但似乎无法让它工作——我在两行上得到了两个输出。
我尝试过的命令(以及其许多变体)是:
ssh [email protected] -- 'echo -n "VMName : " && lsblk | grep -i disk' && 'echo -n " Hypervisor = HypervisorHostName"'
输出结果分为两行,如下所示:
VMName :vda 254:0 0 20G 0 磁盘
虚拟机管理程序 = HypervisorHostName
而我想得到:
VMName :vda 254:0 0 20G 0 磁盘 Hypervisor = HypervisorHostName
我觉得这很简单。我是不是忽略了显而易见的东西?
谢谢,
艾伦。
请注意,命令行中最后一个
&&
ie之后的部分将在会话关闭后echo -n " Hypervisor = HypervisorHostName"
在您本地的计算机上执行,而不会在远程计算机上或会话期间执行...在您的情况下,仅传递第一组单引号之间的命令。ssh
ssh
ssh
ssh
'...'
也就是说,你似乎主要处理字符串,你显然可以完全控制它们的打印方式,除了决定的
lsblk | grep -i disk
位之外grep
......我在想为什么不使用命令替换语法将其转换为字符串,然后使用 shell 的内置函数及其字符串说明$(...)
符将整个内容格式化为一个字符串,如下所示:printf
%s
一般来说,您可以通过管道将标准输出连接到
paste -s
行对。但是在这种情况下我建议使用
awk
而不是以便grep
您可以直接打印所需的格式化输出,例如:如果您确实不需要不区分大小写的匹配,则可以省略
IGNORECASE=1
并使用任何 POSIX 。awk
或者,你可以全力以赴,使用
lsblk
命令的 JSON 输出,选择磁盘并使用打印所需的字符串jq
- 这将防止在输出中的其他地方出现字符串“disk”的错误匹配 - 例如或者
(我省略了一些
."maj:min"
可能不感兴趣的字段)。以下几件简单的事情可能会让你行动起来:
www.tldp.org有 PDF 版的“Bash 指南”——我建议浏览一下,也许能学到一两个窍门。
这样你就知道有什么了,然后可以通过搜索查找。
请尝试一下:
如果这实现了您的要求,请告诉我们:-)
附录:正如terdon指出的那样,我意外地使用了 & 而不是 &&。作为额外的奖励,&& 可以正确获取从左到右的顺序:
这是被诅咒的,但它一直有效,直到它失效为止,并且在后一种情况下充当其自身的解释:
更棒的是,作为一个清晰可见的权宜之计,它实际上适用于以下语法:
如果不以 ### 开头,则行的开头还不够明确。