bash aptitude lista de pacotes de instalação da variável shell

1

Eu estou no Debian GNU / Linux 8 Jessie, e tentando instalar pacotes com o aptitude em um script bash de uma variável do shell. A variável shell está sendo interpretada como um único pacote "pkg1 pkg2 pkg3 ..." e não está sendo encontrado, ou apenas o primeiro pacote da lista está sendo analisado.

#!/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"

E o packages.txt é o que você imagina que seria:

git
gist
curl

# build from source
build-essential
cmake
    
por lscstu22 02.01.2017 / 00:29

1 resposta

2

Depois de remover os comentários de packages.txt , o que você tem é uma lista de nomes de pacotes separados por espaço em branco. Há um operador de shell para dividir uma string em partes separadas por espaço em branco: variável sem aspas ou substituição de comando. A expansão sem aspas é, na verdade, o operador “split + glob”: trata o resultado da expansão como uma lista de padrões globais que devem ser expandidos. Mas como os nomes dos pacotes deb não contêm nenhum caractere curinga da shell, a etapa glob não fará nada, portanto você pode usar o operador split + glob.

Espaços e novas linhas são separadores válidos por padrão, portanto, você não precisa converter as novas linhas em espaços. Apenas mantenha o padrão IFS . E você também não precisa despir linhas em branco, já que vários separadores são tão bons quanto um (quando os separadores são espaços em branco).

aptitude install $(grep -v '^#' packages.txt)
    
por 02.01.2017 / 01:13