2017-09-03 11 views
0

私は今、私はbashのすべてのバージョン情報を確認するためにwhich -a bash | xargs -I % echo % "--version" | shを使用することができますなどbashを含める私のMacOSのシエラ、coreutilswhich、上のいくつかのGNUパッケージをインストールしているが、二つのバージョン情報との間には分離はありません。1行複数コマンドの出力を分割するにはどうすればよいですか?

$ 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から同等の動作を得るための議論については、標準のアプリケーション使用法の節を参照してください。 –

答えて

0

、ループを使用します。次のように

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

シェル組み込みの 'type'ではなく' which -a'を使うのはなぜですか?また、 'IFS = read -r cmd'を使わない限り、入力(先頭と末尾の空白を取り除き、バックスラッシュを取り除く)を行います。あなたはバックスラッシュで終わる場所に通訳を置いてはいけませんが、うーん... ... –

+0

@CharlesDuffyこれは、OPが使っていたものなので、私は '' 'を使っていました。ユーティリティのすべてのインスタンスのパスを生成するコマンドは機能します。 – Kusalananda

+0

@Kusalanandaご協力ありがとうございます。しかし、あなたのコードを実行したときにエラー '-bash:print:command not found'を見つけました。実際、私はあなたのコード全体をコピーしました。 'コマンド'とは何ですか? – liyang

0

を私はこれを書くと思います:

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

注:

  • のない使用をwhich。これはbashに組み込まれているシェルではないので、type(つまり、関数とエイリアスの認識)から得られるメリットはありません。その出力は行指向であるため、可能なすべてのファイル名(例えば、改行を含んでいる - はい、が有効です)を明白に出力することはできません。
  • 一般に、ライン指向のコンテンツに依存しません。プレースホルダ({})が1つのトークンとして渡されると、find -execは、そのトークンに対して返された正確なファイル名を置き換えます。可能なargv値のドメイン(有効なすべてのC文字列、つまりNULを含む文字列はない)が一般的なシステム上の可能なファイル名のドメインと一致するため、潜在的なバグが導入されることはありません。
  • インタープリタのテキストとパイプを生成しません。これはです。エラーが発生しやすく、シェルインジェクションの脆弱性を引き起こします。PATHに/tmp/$(rm -rf ~)が含まれていて、そのディレクトリにbash実行ファイルが含まれているとどうなるか考えてみましょう。
+0

ありがとうございます。私はあなたのコードをコピーして実行しましたが、結果にはmacOSによって出荷されたbashのバージョンのみが含まれています。私のニーズに合っていません。 – liyang

関連する問題