2017-09-03 63 views
0

我已經安裝在我的MacOS塞拉利昂一些GNU軟件,其中包括bashcoreutilswhich,等等。現在我可以用which -a bash | xargs -I % echo % "--version" | sh檢查的bash所有版本信息,但之間有兩個版本信息不分離:如何分隔一行多個命令的輸出?

$ which -a bash | xargs -I % echo % "--version" | sh 
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0) 
Copyright (C) 2016 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 

This is free software; you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 
# There should be one or more blank lines as separation. 
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16) 
Copyright (C) 2007 Free Software Foundation, Inc. 

我試過... echo -e % "--version\n" ...,但它不能工作。請幫助我,謝謝。

+0

一般來說,最好避免'echo -e'。請參閱http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html上的「echo」的POSIX規範,特別是「*實現不應支持任何選項*」。 '-n'是明確允許的(儘管不是必需的;稍後會在該文檔中看到),但其他任何規則都是違反規範的。因此,bash *可能或不可以*支持'echo -e',這取決於它的編譯時和運行時選項是否將它配置爲兼容。有關從printf獲取等同行爲的討論,請參閱標準的APPLICATION USAGE部分。 –

回答

0

對於輸出的更多的控制,使用循環:

which -a bash | 
while read cmd; do 
    printf '%s\t----------\n' "$cmd" 
    command "$cmd" --version 
    echo 
done 
+0

爲什麼'which -a'而不是shell-builtin'type''?除非使用'IFS = read -r cmd',否則它會輸入輸入(去除前導和尾隨空白並去除反斜槓)。當然,你*不應該*在一個以反斜槓結尾的地方有一個解釋器,但是......好吧...... –

+0

@CharlesDuffy我只使用了'which',因爲這就是OP所使用的。任何爲該實用程序的所有實例生成路徑的命令都可以使用。 – Kusalananda

+0

@Kusalananda感謝您的幫助。但是當我運行你的代碼時,我遇到了一個錯誤'-bash:print:command not found'。事實上,我複製了你的整個代碼。 「command」的含義是什麼? – liyang

0

我會寫這個如下:

IFS=: read -r -a path_entries <<<"$PATH" 
find "${path_entries[@]}" -maxdepth 1 -name bash -type f -exec '{}' --version ';' 

注:

  • 沒有用的which。這不是shell中內置的shell,所以它不會給你從type(即功能和別名的意識)中獲得的好處;並且因爲它的輸出是面向行的,所以它不能明確地發出所有可能的文件名(例如那些包含換行符的文件名,其中有效)。
  • 通常不依賴於面向行的內容。當佔位符({})作爲單個標記傳遞時,find -exec將替換爲該標記返回的確切文件名。因爲可能的argv值的域(所有有效的C字符串,也就是說,沒有包含NUL的字符串)與通用系統上可能的文件名的域匹配,這就避免了引入潛在的錯誤。
  • 沒有生成文本和管道到解釋器。這是一個極易出錯的技術,會導致shell注入漏洞:考慮如果PATH包含/tmp/$(rm -rf ~),並且該目錄包含bash可執行文件會發生什麼情況。
+0

也謝謝你。我已經複製並運行了你的代碼,但是結果只包含macOS發佈的bash版本,並不適合我的需要。 – liyang