私は現在、いくつかの異なるディストリビューション (主に Redhat および Debian ベース) で一連のパッケージをインストール/チェックする大規模な BASH スクリプトを変更している最中です。
ディストリビューション間のいくつかの違い (例: rpm と dpkg、yum と apt など) を処理するために、スクリプトがif debian then this, otherwise this
ステートメントでいっぱいにならないように、いくつかの変数にさまざまなコマンド文字列をロードしようとしています。ただしawk
、 eval ステートメント内に配置されるのが気に入らないようで、その理由がわかりません。
例
# Example dpkg --list output
# ii bash 4.1-2ubuntu3 The GNU Bourne Again SHell
dpkg --list | grep 'bash'
# Outputs bash entries in dpkg.
cmd="dpkg --list | grep 'bash'"
eval $cmd
# Outputs as expected, same as above.
dpkg --list | awk '/^.i/ { print $2 }'
# Outputs as expected, a list of package names.
cmd="dpkg --list | awk '/^.i/ { print $2 }'"
eval $cmd
# Awk prints full output from dpkg for every line matching the regex.
上記のコードでは、特定のパッケージを grep するだけで問題なく動作し、期待どおりに出力されますが、awk を使用してパッケージ名の完全なリストを生成しようとすると、print $2
無視されているように見え、単に行全体が出力されます。
何か案は?