Bash 命令標準輸出
我正在嘗試使用 bash 腳本獲取軟體版本。命令很簡單:
/usr/local/sbin/keepalived -v
這是輸出:
Keepalived v2.0.13 (02/18,2019), git commit 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 Fri Feb 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
System options: 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 (02/18,2019), git commit 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
但是,我得到一個空文件。
有人可以解釋為什麼會發生這種情況,我怎樣才能只得到第一行?
發生這種情況是因為**/usr/local/sbin/keepalived -v**的輸出將轉到 stderr 而不是 stdout。
您可以在提取所需數據之前將輸出重定向到標準輸出
keepalived -v 2>&1 | head -n 1