Posso executar o seguinte a partir da linha de comando do bash:
$ pkg="linux-headers-$(uname -r)"
$ dpkg -l "${pkg}" | grep '^ii '
ii linux-headers-5.15.0-130-generic 5.15.0-130.140~20.04.1 amd64 Linux kernel headers for version 5.15.0 on 64 bit x86 SMP
No entanto, quando eu crio um arquivo com o nome do pacote e executo o mesmo comando lendo a entrada do arquivo, ele falha. Crie o arquivo ...
$ echo "build-essential" > pkgs.list
$ echo "linux-headers-\$(uname -r)" >> pkgs.list
$ echo "gcc" >> pkgs.list
$ cat pkgs.list
build-essential
linux-headers-$(uname -r)
gcc
... e leia como entrada:
$ IFS=$'\n' ; while read pkgline ; do dpkg -l "${pkgline}" | grep '^ii ' ; done < pkgs.list
ii build-essential 12.8ubuntu1.1 amd64 Informational list of build-essential packages
dpkg-query: no packages found matching linux-headers-$(uname -r)
ii gcc 4:9.3.0-1ubuntu2 amd64 GNU C compiler
O que precisa mudar para fazer o comando dpkg -l funcionar dentro do loop, lendo de um arquivo, da forma como ele fez na linha de comando? Eu tenho controle total sobre o conteúdo do arquivo e o loop while, mas prefiro não substituir o valor de $(uname -r) no arquivo. O texto deve permanecer "$(uname -r)" (ou alguma variação disso) no arquivo. Eu tentei várias maneiras de usar "eval" sem sucesso, incluindo a resposta para bash : leia uma linha de um arquivo e interprete esta linha . Talvez eu esteja sendo denso, mas se essa for a resposta, não vejo como aplicá-la a este caso.
Editar: Hmm, sim, eu fui denso. As maneiras que tentei usar "eval" foram:
dpkg -l eval ${pkgline}
dpkg -l ${!pkgline}
p=eval "${pkgline} ; dpkg -l "${p}"
e até mesmo
dpkg -l "eval echo -e ${pkgline}"
depois de ler bash : leia uma linha de um arquivo e interprete essa linha . Mas o que funciona é o simples:
eval dpkg -l "${pkgline}"
Bem, obrigado por perguntar.
Usando
echo
em vezdpkg
do que não tenho na minha máquina:Basta substituir
echo
pordpkg -l
.O exposto acima pressupõe que você esteja no controle do conteúdo do seu arquivo de entrada e, portanto, não corra o risco de executar algum código malicioso por meio do
eval
.