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つのトークンのみを生成しmost
、less
ifIFS
には空白が含まれているか(デフォルトでそうであるように)ifはIFS
設定されません。それ以外の場合は、パッケージ名と一致しない
単一のトークンを生成します。most less
変数の割り当てに注意してください現在の環境に影響を与えるなど、コマンド名を持たない単純なコマンドの一部である場合、IFS=$'\n' arr=($(cat .testlist.rs))
後続の拡張は改行にのみ分割されます。
各要素は
arr
;の完全な行です。.testlist.rs
arr
in の各要素の拡張はもはやfor pkg in ${arr[@]}
分割されません。コンテンツがスペースで区切られたs要素に関連付けられている1行の拡張は、もはや分割されず、
$(echo "$sum")
再びパッケージ名として使用される単一のタグになります。sum
arr
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