2016-11-10 47 views
2

此命令按預期工作:

(dpkg -l | egrep "linux.+3.8.0.*44" | awk '{print $2}') 
linux-generic-lts-raring 
linux-headers-3.8.0-44 
linux-headers-3.8.0-44-generic 
linux-headers-generic-lts-raring 
linux-image-3.8.0-44-generic 
linux-image-generic-lts-raring 

然而,當我與bash -c運行它它不工作:

bash -c "(dpkg -l | egrep "linux.+3.8.0.*44" | awk '{print $2}')" 
ii linux-generic-lts-raring   3.8.0.44.44      Generic  Linux kernel image and headers 
ii linux-headers-3.8.0-44   3.8.0-44.66~precise1    Header files related to Linux kernel version 3.8.0 
ii linux-headers-3.8.0-44-generic 3.8.0-44.66~precise1    Linux kernel headers for version 3.8.0 on 64 bit x86 SMP 
ii linux-headers-generic-lts-raring 3.8.0.44.44      Generic Linux kernel headers 
ii linux-image-3.8.0-44-generic  3.8.0-44.66~precise1    Linux kernel image for version 3.8.0 on 64 bit x86 SMP 
ii linux-image-generic-lts-raring 3.8.0.44.44      Generic Linux kernel image 

我不知道爲什麼。這幾乎就像管道破裂一樣。

+0

您能否生成一個示例,說明不在Debian派生髮行版上的用戶可以複製/粘貼/運行? –

+0

也就是說,一個非常明顯的問題是傳遞給'egrep'的引號是外部使用的相同類型。 –

+0

...爲什麼要將grep和awk作爲單獨的命令使用? 'bash -c「dpkg -l | awk'/linux.+3[.]8[.]0.*44/ {print $ 2}'」'。哦。除了「$ 2」在那裏不起作用。 –

回答

4

由於您使用雙引號,所以$2被shell擴展,而不是字面上傳遞到awk。在awk中,print默認情況下會打印$0,即。整個輸入行,所以如果它擴大到一個空值,那就是你的問題。

bash -c "(dpkg -l | egrep 'linux.+3.8.0.*44' | awk '{print \$2}')" 

順便說一句 - 有沒有必要使用grepawk分開。

bash -c "dpkg -l | awk '/linux.+3.8.0.*44/ { print \$2 }'" 

如果您的封閉殼是本身bash中,然後可以使用$''作爲替代裝置,以提供文字串:

# $'' only works with bash, ksh, etc., but won't interpret $2, and lets 
# you pass literal quotes 
bash -c $'dpkg -l | awk \'/linux.+3[.]8[.]0.*44/ { print $2 }\'' 

相反,如果您的封閉殼是基線POSIX,包括文字單單引號字符串中的引號會變得更加複雜。

bash -c 'dpkg -l | awk '"'"'/linux.+3[.]8[.]0.*44/ { print $2 }'"'"''