2014-06-25 56 views
0

操作系統:lubuntu 13.04在一個bash腳本中捕獲輸出的段錯誤

我正在運行一個簡單的bash腳本來將各種系統信息保存到一個文件中。我主要是在從命令輸出到文件中回顯。我運行的命令之一是:

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

我注意到在某些系統上,上面的命令只會返回空白。

如果我直接從CLI運行「nmcli dev list」,我注意到nmcli得到了段錯誤,因此echo沒有將該命令的任何內容放入$ CI文件中。

雖然這裏真正的問題是nmcli具有段錯誤,但是在「nmcli dev list」的輸出中仍然存在有價值的信息,我希望將其保存起來,直到出現段錯誤。

鑑於我在本網站和Google搜索中發現和閱讀的內容,似乎沒有太簡單的答案,因爲由於段錯誤,命令從未完成。但是,我希望有人可能有一個解決方法或其他技術的想法,以捕獲輸出直到段錯誤。

[email protected]:/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 
+1

你正在一個子殼中運行它。爲什麼不直接運行它? 'nmcli dev list >> foo.txt'? –

+0

感謝您的快速回復。我最初試圖直接按照你所說的去做,但它的行爲方式是一樣的。 foo.txt仍然是空白的。我想我把它加到了一個子殼中,我試圖讓它起作用,但是由於所有的頭撞到了桌子上,我試圖讓它工作,所以我失去了蹤跡:) –

+0

@Marc B只是爲了確定,我重新-ran直接,而foo.txt爲空,CLI在CLI上顯示「Segmentation fault」。 –

回答

2

您是否嘗試過重定向輸出和錯誤給您的文件。

根據在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 
+0

這很奇怪,因爲重定向stderr的結果是一樣的。 'user1 @ comp1:/ home/user1 $ nmcli dev list 2>&1 >> foo.txt 分割錯誤 user1 @comp1:/ home/user1 $ nmcli dev list&>> foo.txt 分割錯誤 user1 @ comp1 :/ home/user1 $ cat foo.txt user1 @ comp1:/ home/user1 $' –

+0

您可以嘗試捕獲段錯誤。查看[本文]中的第一個答案(http://unix.stackexchange.com/questions/53289/does-segmentation-fault-message-come-under-stderr)以及用戶在評論中提供的示例。 – spetz

+0

@spetz你有'舊版本'倒退,它應該是'nmcli dev list >> $ CI 2>&1' – BroSlow