linux - 在出现段错误的 bash 脚本中捕获命令的输出

标签 linux bash

操作系统:lubuntu 13.04

我正在运行一个简单的 bash 脚本来将各种系统信息保存到一个文件中。我主要只是将命令的输出回显到文件中。我运行的命令之一是:

echo "$(nmcli dev list)" >> $CI

我注意到在某些系统上,上述命令只会返回空白。

如果我直接从 CLI 运行“nmcli dev list”,我注意到 nmcli 会出现段错误,因此 echo 不会将任何内容放入该命令的 $CI 文件中。

虽然这里真正的问题是 nmcli 有段错误,但“nmcli dev list”的输出中仍然有有值(value)的信息,我想保存到它出现段错误。

鉴于我在本网站和谷歌搜索中发现和阅读的内容,似乎没有太简单的答案,因为该命令由于段错误而从未完成。但是,我希望有人可能对变通方法或其他技术有想法,以在出现段错误之前捕获输出。

user1@comp1:/home/user1$ nmcli dev list
GENERAL.DEVICE:                         eth0
GENERAL.TYPE:                           802-3-ethernet
GENERAL.VENDOR:                         Marvell Technology Group Ltd.
GENERAL.PRODUCT:                        88E8040 PCI-E Fast Ethernet Controller
GENERAL.DRIVER:                         sky2
GENERAL.DRIVER-VERSION:                 1.30
GENERAL.FIRMWARE-VERSION:
GENERAL.HWADDR:                         00:24:81:5D:F3:F9
GENERAL.STATE:                          20 (unavailable)
GENERAL.REASON:                         2 (Device is now managed)
GENERAL.UDI:                            /sys/devices/pci0000:00/0000:00:1c.1/0000:02:00.0/net/eth0
GENERAL.IP-IFACE:
GENERAL.NM-MANAGED:                     yes
GENERAL.AUTOCONNECT:                    yes
GENERAL.FIRMWARE-MISSING:               no
GENERAL.CONNECTION:                     not connected
CAPABILITIES.CARRIER-DETECT:            yes
CAPABILITIES.SPEED:                     unknown
Segmentation fault

使用 bash -x 运行我的脚本的结果:

+ echo '    <NMCLI> '
++ nmcli dev list
+ echo ''
+ echo '    </NMCLI> '

整个脚本:

#!/bin/bash

# Define file to save configuration info to
CI=config-info.txt

# Get hostname
HOSTNAME=$(hostname)
echo "    <Hostname>$HOSTNAME</Hostname>" >> $CI

# Get IP
IP=$(ifconfig | grep -m 1 -E '(inet.*Bcast.*Mask)' | awk '{print $2}' | sed s/addr:/""/)
echo "    <IP>$IP</IP>" >> $CI

# Get SubnetMask
MASK=$(ifconfig | grep -m 1 -E '(inet.*Bcast.*Mask)' | awk '{print $4}' | sed s/Mask:/""/)
echo "    <SubnetMask>$MASK</SubnetMask>" >> $CI

# Get Gateway IP
GATEWAY=$(ip route show | grep  -m 1 'default via' | awk '{print $3}')
echo "    <Gateway>$GATEWAY</Gateway>" >> $CI

# Get DNS Server IP
DNS=$(nmcli dev list | grep -m 1 DNS | awk {'print $2'})
echo "    <DNS>$DNS</DNS>" >> $CI

# Get MAC Address of NIC
MAC=$(ifconfig | grep -m 1 HWaddr | awk '{print $5}')
echo "    <MAC>$MAC</MAC>" >> $CI

# Get System Uptime
UPTIME=$(cat /proc/uptime | awk '{print $1}')
echo "    <Uptime>$UPTIME</Uptime>" >> $CI

# Get NIC linkspeed
LINKSPEED=$(nmcli dev list | grep -m 1 CAPABILITIES.SPEED | awk '{print $2 " " $3}')
echo "    <LinkSpeed>$LINKSPEED</LinkSpeed>" >> $CI

# Get NIC Vendor
# The first awk gets all columns in the line excluding the 1st column.
# The second awk removes the leading space in front of the output of the first awk
NICVENDOR=$(nmcli dev list | grep -m 1 GENERAL.VENDOR | awk '{$1=""; print $0}' |  awk '{sub(/^[ \t]+/, "")};1'
)
echo "    <NicVendor>$NICVENDOR</NicVendor>" >> $CI

# Get NIC Model
NICMODEL=$(nmcli dev list | grep -m 1 GENERAL.PRODUCT | awk '{$1=""; print $0}' |  awk '{sub(/^[ \t]+/, "")};1')
echo "    <NicModel>$NICMODEL</NicModel>" >> $CI

# Get NIC Driver Name
NICDRIVER=$(nmcli dev list | grep -m 1 GENERAL.DRIVER | awk '{$1=""; print $0}' |  awk '{sub(/^[ \t]+/, "")};1')
echo "    <NicDriver>$NICDRIVER</NicDriver>" >> $CI

# Get NIC Driver Version
NICDRIVERVERSION=$(nmcli dev list | grep -m 1 GENERAL.DRIVER-VERSION | awk '{$1=""; print $0}' |  awk '{sub(/^[ \t]+/, "")};1')
echo "    <NicDriverVersion>$NICDRIVERVERSION</NicDriverVersion>" >> $CI

# Get "ifconfig -a" information
echo "    <Ifconfig>" >> $CI
echo "$(ifconfig -a)" >> $CI
echo "    </Ifconfig>" >> $CI

# Get "nmcli dev list" information
echo "    <NMCLI> "  >> $CI
echo "$(nmcli dev list)" >> $CI
echo "    </NMCLI> "  >> $CI

# Get "nmcli -p dev wifi list" output - This lists all detected Wireless Networks
echo "    <Wireless>" >> $CI
echo "$(nmcli -p dev wifi list)" >> $CI
echo "    </Wireless>" >> $CI

# Get "nmcli -p con status" output - Shows the status for all known network connections
echo "    <ConnectionsStatus>" >> $CI
echo "$(nmcli -p con status)" >> $CI
echo "    </ConnectionsStatus>" >> $CI

# Get "nmcli -p con list" output - Lists all connections NetworkManager has
echo "    <ConnectionsAll>" >> $CI
echo "$(nmcli -p con list)" >> $CI
echo "    </ConnectionsAll>" >> $CI

# Get "route" information
echo "    <Route>" >> $CI
echo "\"route\": " >> $CI
echo "$(route)" >> $CI
echo " " >> $CI
echo "\"route -n\": " >> $CI
echo "$(route -n)" >> $CI
echo " " >> $CI
echo "\"route -Cn\": " >> $CI
echo "$(route -Cn)" >> $CI
echo "    </Route>" >> $CI

最佳答案

您是否尝试过将 stdout 和 stderr 重定向到您的文件。

根据在 http://www.tldp.org/LDP/abs/html/io-redirection.html 找到的文档您可以使用 &> 将两者都重定向到文件,或使用 2>&1 将 stderr 重定向到 stdout。

nmcli dev list &>> $CI

是你应该需要的。如果您运行的是旧版本的 bash,请尝试以下操作。

nmcli dev list >> $CI 2>&1 

注意:如果出于某种原因您仍然需要 echo,则需要将重定向放在子 shell 中和命令之后,或者将其分组并重定向整个输出,如

echo "$(nmcli dev list >> $CI 2>&1)" >> $CI 2>&1 

{ echo "$(nmcli dev list)"; } >> $CI 2>&1 

关于linux - 在出现段错误的 bash 脚本中捕获命令的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24415266/

相关文章:

regex - Grep 特定长度的字符

c++ - 动态库中的 libstdc++ 静态链接

linux - 登录后运行 bash 脚本

bash - IBM/secure-gateway-client docker与--F(acl文件)选项一起运行

linux - 在 shell 中调用 Property 的正确语法是什么

linux - kdevelop 3.5 : configure: error: C++ compiler cannot create executables

linux - 何时为 Linux 内核 4.11 发布 RT_PREEMPT 补丁

linux - 解析和替换两个文件中的一些字符串

linux - 在 Ubuntu 上,bash 中的彩色多行 PS1 使用向上箭头历史记录时出错

linux - grep : print value when grep returns nothing 之后的 awk