쉘 변수에서 bash 적성 설치 패키지 목록

쉘 변수에서 bash 적성 설치 패키지 목록

저는 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. 그리고 여러 개의 구분 기호는 하나만큼 좋기 때문에(구분 기호가 공백인 경우) 빈 줄을 제거할 필요도 없습니다.

aptitude install $(grep -v '^#' packages.txt)

관련 정보