簡體   English   中英

如何分隔單行多個命令的輸出?

[英]How to separate outputs of one-line multiple commands?

我已經在macOS Sierra上安裝了一些GNU軟件包,其中包括bashcoreutilswhich等。現在,我可以使用which -a bash | xargs -I % echo % "--version" | sh which -a bash | xargs -I % echo % "--version" | sh 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" ... ,但是它不起作用。 請幫助我,謝謝。

要對輸出進行更多控制,請使用循環:

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

我會這樣寫:

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

注意:

  • 沒有用的which 這不是bash內置的shell,因此它不會給您任何type帶來的好處(即,對功能和別名的了解)。 並且由於其輸出是面向行的,因此它不能明確地發出所有可能的文件名(例如包含換行符的文件名,是的,這有效的)。
  • 通常,不依賴於面向行的內容。 當占位符( {} )作為單個令牌傳遞時, find -exec替換該令牌返回的確切文件名。 由於可能的argv值的域(所有有效的C字符串,也就是說,沒有包含NUL的字符串)與常見系統上可能的文件名的域匹配,因此避免了引入潛在的錯誤。
  • 沒有生成文本並將其傳遞給解釋器。 這是一種極易出錯的技術,會引起外殼注入漏洞:考慮一下PATH包含/tmp/$(rm -rf ~)且該目錄包含bash可執行文件的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM