无法通过列出名称的文本文件安装软件包

无法通过列出名称的文本文件安装软件包

我也尝试使用 IFS=" " 但结果是相同的。

arch-chroot /mnt
pacman -Sy
echo "most less" > "/root/.testlist.rs"
pacman -S $(cat "/root/.testlist.rs")
# [1] error: target not found: most less
pacman -S $(cat "/root/.testlist.rs" | tr -d '\n' | sed 's/\s$//')
# [2] error: target not found: most less
pacman -S $(eval echo $(cat "/root/.testlist.rs")
# [3] error: target not found: most less

我发现在这些命令之前还有另一个命令破坏了在 archiso 映像上运行的 bash 会话:

IFS=$'\n' arr=($(cat "/root/.testlist.rs"))
sum=""; for pkg in ${arr[@]}; do sum+=$(echo "$pkg "); done

pacman -S $(echo "$sum")
# error: target not found: zathura-pdf-mupdf zita-alsa-pcmi zita-resampler zlib zsh zsh-syntax-highlighting
pacman -S $(eval echo "$sum")
# error: target not found: zathura-pdf-mupdf zita-alsa-pcmi zita-resampler zlib zsh zsh-syntax-highlighting

答案1

正如您所发现的,您面临的问题取决于 的值IFS

给定一个包含示例包列表的文件:

$ printf '%s\n' 'most less' >./.testlist.rs
$ cat ./.testlist.rs 
most less

的扩展$(cat .testlist.rs)仅产生两个标记most,并且lessifIFS包含空格(默认情况下如此)或 ifIFS未设置。
否则,它会产生单个 token most less,它当然不对应于任何包名称。

注意变量赋值影响当前环境当它们是没有命令名称的简单命令的一部分时,如IFS=$'\n' arr=($(cat .testlist.rs)).因此,后续扩展仅在换行符上拆分,这意味着:

  • 每个的元素都是来自;arr的一整行。.testlist.rs

  • arrin的每个元素的展开for pkg in ${arr[@]}不再进一步分割;

  • 的扩展$(echo "$sum")-sum其中 的内容是由空格分隔的 s 元素串联而成的单行arr- 不会进一步拆分,再次导致用作包名称的单个标记。

每行保存一个包似乎更实用:

$ printf '%s\n' most less >.testlist.rs 
$ cat .testlist.rs 
most
less

然后,在 Bash 中,您可以轻松使用mapfile(或其同义词readarray)根据文件内容填充数组:

$ mapfile -t arr <.testlist.rs 
$ declare -p arr
declare -a arr=([0]="most" [1]="less")

并将其用作参数,如 中所示pacman -S "${arr[@]}"

最后请注意,whilepacman action [options] $(command generating a package list)经常用于拱门维基,(非常)长的包列表可能会导致pacman失败并出现“参数列表太长”错误。另一种方法可以避免该问题,并且可以很好地处理存储在文件中的包列表:

<.testlist.rs xargs -o sudo pacman -S

其中-o( --open-tty) 是允许pacman与用户交互所必需的。当在同一行(如您的情况)
列出多个包并用空格(或制表符)分隔时,这实际上也适用。.testlist.rs

相关内容