私はDebian GNU / Linux 8 Jessieを使用しており、シェル変数のbashスクリプトに適したパッケージをインストールしようとしています。シェル変数は単一のパッケージ「pkg1 pkg2 pkg3...」と解釈され、見つからないか、リストの最初のパッケージのみが検証されます。
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
# being treated as a single package with spaces in the name
# package "git gist curl build-essential cmake " not found
apt_packages="$(cat packages.txt | grep -Ev '^$|^#' | tr '\n' ' ')"
# only the first package (git) in the list is parsed and installed
apt_packages=( "$(cat packages.txt | grep -Ev '^$|^#')" )
aptitude install "$apt_packages"
あなたがpackages.txt
想像するものは次のとおりです。
git
gist
curl
# build from source
build-essential
cmake
ベストアンサー1
からコメントを削除すると、スペースで区切られたpackages.txt
パッケージ名のリストが表示されます。文字列をスペースで区切られた部分に分割するシェル演算子(引用符なしの変数またはコマンドの置き換え)があります。引用符なしの拡張は実際には「split+glob」演算子です。拡張結果をリストとして扱います。グローバルモードどちらを拡張する必要がありますか?ただし、debパッケージ名にはシェルワイルドカードが含まれていないため、globフェーズでは何もしないため、分割+glob演算子を使用できます。
デフォルトでは、空白と改行はどちらも有効な区切り文字であるため、改行を空白に変換する必要はありません。ただデフォルト値を維持してくださいIFS
。そして、複数の区切り文字は1つだけ良いので(区切り文字が空白の場合)、空白行を削除する必要もありません。
aptitude install $(grep -v '^#' packages.txt)