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
, less
if IFS
에는 공백이 포함되어 있거나(기본적으로 그렇듯이) if가 IFS
설정되지 않습니다. 그렇지 않으면 패키지 이름과 일치하지 않는
단일 토큰을 생성합니다 .most less
변수 할당에 주의하세요현재 환경에 영향을 미치다와 같이 명령 이름이 없는 간단한 명령의 일부인 경우 IFS=$'\n' arr=($(cat .testlist.rs))
후속 확장은 줄 바꿈으로만 분할됩니다.
각 요소는
arr
;의 전체 행입니다..testlist.rs
arr
in의 각 요소의 확장은for pkg in ${arr[@]}
더 이상 더 이상 분할되지 않습니다.콘텐츠가 공백으로 구분된 s 요소로 연결된 한 줄인 확장은
$(echo "$sum")
더 이상 분할되지 않으며 다시 패키지 이름으로 사용되는 단일 태그가 됩니다.sum
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[@]}"
.
마지막으로 while이 pacman action [options] $(command generating a package list)
자주 사용된다는 점에 유의하세요.아치스 위키, (매우) 긴 패키지 목록은 pacman
"매개변수 목록이 너무 김" 오류로 인해 실패할 수 있습니다. 문제를 피하고 파일에 저장된 패키지 목록을 잘 사용하는 또 다른 방법은 다음과 같습니다.
<.testlist.rs xargs -o sudo pacman -S
여기서 -o
( --open-tty
)는 pacman
사용자와의 상호 작용을 허용하는 데 필요합니다. 이는 여러 패키지가 동일한 줄(귀하의 경우처럼)에 나열되고
공백(또는 탭)으로 구분된 경우에도 실제로 작동합니다..testlist.rs