回答:
これらの線に沿って何かがトリックを行う必要があります。
apt-get install $(grep -vE "^\s*#" filename | tr "\n" " ")
$(something)構造は、somethingコマンドを実行し、その出力をコマンドラインに挿入します。
grepコマンドは、#で始まる行を除外し、オプションでその前の空白を許可します。次に、trコマンドは改行をスペースに置き換えます。
trマルチバイトの行末シーケンスで失敗します(考えてみてください\r\n)、なぜ使用しないのですxargsか?
次のコマンドはsudo apt-get install、パッケージリストが空の場合は実行されないため、代替策よりも(わずかに)改善されています。
xargs -a <(awk '! /^ *(#|$)/' "$packagelist") -r -- sudo apt-get install
この-aオプションは、標準入力ではなくファイルからアイテムを直接読み取ることに注意してください。xargsstdinが使用するためにstdinを変更せずに残さなければならないため、ファイルをパイプ処理したくありませんapt-get。
xargsこれを行う正しい方法です。トリック<()はきれいです。
xargsなりますが、確かARG_MAX に達していません。
xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install" <(" ではなく " "でなければならず、apt-getの$(オプション-yは良い考えです。
awkファイル記述子にリダイレクトしxargs -aて読み取ります。だから、絶対に欲しいの<(ではなく$(。試してみてください、あなたは私の意味を見るでしょう。コマンドを無人で実行する場合で、インストールするものが正確にわかっている場合-yは、フラグを付けることをお勧めします。