Bash 命令标准输出

Bash 命令标准输出

我正在尝试使用 bash 脚本获取软件版本。命令很简单:

/usr/local/sbin/keepalived -v

这是输出:

Keepalived v2.0.13(2019 年 2 月 18 日),git 提交 v2.0.12-53-ga9ed1993+

版权所有 (C) 2001-2019 Alexandre Cassen,

使用 Linux 3.10.0 的内核头文件构建,在 Linux 3.10.0-957.5.1.el7.x86_64 上运行 #1 SMP 星期五 2 月 1 日 14:54:57 UTC 2019

配置选项:NFTABLES LVS VRRP VRRP_AUTH OLD_CHKSUM_COMPAT FIB_ROUTING SNMP_V3_FOR_V2 SNMP_VRRP SNMP_CHECKER SNMP_RFCV2 SNMP_RFCV3 FILE_LOGGING LOG_FILE_APPEND EINTR_CHECK

系统选项:PIPE2 SIGNALFD INOTIFY_INIT1 VSYSLOG EPOLL_CREATE1 IPV6_ADVANCED_API LIBNL3 RTA_ENCAP RTA_EXPIRES RTA_PREF FRA_TUN_ID RTAX_CC_ALGO RTAX_QUICKACK FRA_OIFNAME IFA_FLAGS IP_MULTICAST_ALL NET_LINUX_IF_H_COLLISION LIBIPTC_LINUX_NET_IF_H_COLLISION LIBIPVS_NETLINK VRRP_VMAC CN_PROC SOCK_NONBLOCK SOCK_CLOEXEC O_PATH GLOB_BRACE INET6_ADDR_GEN_MODE SO_MARK SCHED_RT SCHED_RESET_ON_FORK

从这个输出中我只需要第一行:

Keepalived v2.0.13(2019 年 2 月 18 日),git 提交 v2.0.12-53-ga9ed1993+

我尝试了以下方法,但是都不适用于我:

$ /usr/local/sbin/keepalived -v | head -n 1
$ echo "$(/usr/local/sbin/keepalived -v)" | head -n 1

在这两种情况下,我都会收到完整的输出,而不仅仅是第一行。

我尝试将标准输出发送到文件中:

$ /usr/local/sbin/keepalived -v > /tmp/keepalived.txt
$ echo $(/usr/local/sbin/keepalived -v) > /tmp/keepalived.txt
$ /usr/local/sbin/keepalived -v | tee /tmp/keepalived.txt

但是,我得到一个空文件。

有人能解释为什么会发生这种情况吗?我怎样才能仅获得第一行?

答案1

这是因为/usr/local/sbin/keepalived -v将输出到 stderr 而不是 stdout。

您可以在提取所需数据之前将输出重定向到 stdout,方法是:keepalived -v 2>&1 | head -n 1

相关内容