テキストファイルリスト名からパッケージをインストールできません。

テキストファイルリスト名からパッケージをインストールできません。

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)2つのトークンのみを生成しmostlessifIFSには空白が含まれているか(デフォルトでそうであるように)ifはIFS設定されません。それ以外の場合は、パッケージ名と一致しない
単一のトークンを生成します。most less

変数の割り当てに注意してください現在の環境に影響を与えるなど、コマンド名を持たない単純なコマンドの一部である場合、IFS=$'\n' arr=($(cat .testlist.rs))後続の拡張は改行にのみ分割されます。

  • 各要素はarr;の完全な行です。.testlist.rs

  • arrin の各要素の拡張はもはやfor pkg in ${arr[@]}分割されません。

  • コンテンツがスペースで区切られたs要素に関連付けられている1行の拡張は、もはや分割されず、$(echo "$sum")再びパッケージ名として使用される単一のタグになります。sumarr

1行に1つのパッケージを保存する方が実用的です。

$ 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[@]}"

最後に、whileがよくpacman action [options] $(command generating a package list)使用されることに注意してください。アーチスウィキ、(非常に)長いパッケージリストは、pacman「パラメータリストが多すぎる」エラーのため失敗する可能性があります。問題を回避し、ファイルに保存されているパッケージのリストをうまく使用するもう1つの方法は次のとおりです。

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

ここで-o--open-tty)は、pacmanユーザーとのやり取りを許可するために必要です。これは、複数のパッケージが同じ行(あなたの場合のように)に表示され、スペース
(またはタブ)で区切られている場合でも実際に機能します。.testlist.rs

関連情報