我可以从 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
但是,当我创建一个包含包名称的文件并运行相同的命令读取文件输入时,它会失败。创建文件...
$ 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
...并将其作为输入读取:
$ 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
需要进行哪些更改才能使 dpkg -l 命令在循环中工作,从文件中读取,就像在命令行中那样?我可以完全控制文件内容和 while 循环,但我不喜欢替换文件中 $(uname -r) 的值。文本应保留在文件中的“$(uname -r)”(或其某种变体)。我尝试了几种使用“eval”的方法,但没有成功,包括对bash 的回答:从文件中读取一行并解释此行。也许我很笨,但如果这就是答案,我不知道如何将它应用于这种情况。
编辑:嗯,是的,我很笨。我尝试使用“eval”的方式是:
dpkg -l eval ${pkgline}
dpkg -l ${!pkgline}
p=eval "${pkgline} ; dpkg -l "${p}"
甚至
dpkg -l "eval echo -e ${pkgline}"
读完 bash 后:从文件中读取一行并解释这一行。但有效的方法是直接的:
eval dpkg -l "${pkgline}"
嗯,谢谢你的询问。