如何從命令列取得這樣的列表,包括每個實用程式的版本?它們預設是否位於同一個檔案中?
答案1
他們是 [大概] 都一樣(gold
有一個額外的版本-請參閱本文的結尾)。
但請考慮此答案代碼高爾夫的其餘部分,以獲得提取版本的最佳方法。
dpkg -L binutils | grep "/usr/bin/" | xargs -i sh -c "{} --version"
和 roadmr 的功能差不多。
dpkg -L binutils | xargs -i sh -c "{} --version 2>/dev/null || exit 0"
嘗試奔跑一切 dpkg -L ...
輸出。顯然只有可執行檔會運行,所以我們只需要重定向錯誤(並忽略xargs
它們)。
dpkg -L binutils | xargs -i bash -c '[[ -x "{}" && -f "{}" ]] && {} --version'
測試我們正在處理可執行檔而不是過濾路徑。
sudo apt-get install parallel
dpkg -L binutils | grep /usr/bin/ | parallel {} --version
dpkg -L binutils | parallel {} --version 2>/dev/null
dpkg -L binutils | parallel '[[ -x "{}" && -f "{}" ]] && {} --version'
這次我們使用 GNUparallel
來做同樣的事情。parallel
讓我們跳過某些不便之處xargs
(例如它無法跳過任何非零退出程式碼。man parallel
確實是一本很好的讀物。
話雖如此,雖然較短,但我的所有範例都分叉到一個新的 shell 中(不可避免地使用xargs
,並且有點parallel
),因此它們都比 roadmr 慢一些。第一個是最快的。
編輯:到目前為止...
sh <(dpkg -L binutils | awk '/bin\// {print $0 " --version"}')
只有兩把叉子(有點)作為與 for 迴圈一樣快(但短得多)。
編輯: 其實不太一樣。gold
有一個輔助版本(1.11),其他指令沒有。
$ sh <(dpkg -L binutils | awk '/bin\// {print $0 " --version"}') | \
grep Binutils | sort -u | column -t
GNU addr2line (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU ar (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU assembler (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU c++filt (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU dwp (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU elfedit (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU gold (GNU Binutils for Ubuntu 2.23.52.20130913) 1.11
GNU gprof (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU ld (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU nm (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU objcopy (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU objdump (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU ranlib (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU readelf (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU size (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU strings (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU strip (GNU Binutils for Ubuntu) 2.23.52.20130913
答案2
嘗試這個:
for util in `dpkg --listfiles binutils |grep "\/usr\/bin\/"`; do
echo -n "$util -> "; echo "" | $util --version
done
這會取得 binutils 套件中的所有二進位文件,並使用其 --version 參數查詢每個二進位。對於那些期望在終端機中輸入的人,我回顯一個空字串。