ShredOS 사용자 정의의 일부로 디스크 상태에 대한 일부 정보를 수집하는 스크립트를 작성하려고 합니다. 다음 코드 조각의 문제점을 이해할 수 없습니다.
#get disk info
disk_info=$(lsblk --path -AdJo NAME,SIZE,ROTA)
#get names of disks
disk_names+=($(jq '.blockdevices[] | .name' <<< "$disk_info"))
printf "\n\n# DISK HEALTH REPORTS #\n\n"
for name in ${disk_names[@]};
do
#this command works in shell but cannot find device type when run through the script.
disk_health=$(sudo smartctl -s on -a "$name")
printf "$disk_health"
done
실행하면 다음과 같은 결과가 나타납니다.
"/dev/nvme0n1": Unable to detect device type
Pleas specify device type with the -d option.
sudo smartctl -s on -a /dev/nvme0n1
그러나 쉘에서 명령을 실행하면 원하는 출력을 얻습니다. 스크립트를 바꾸면 $name
원하는 출력도 얻을 수 있습니다. (줄 번호(106)에 해당하는 경고가 있지만)/dev/nvme0n1
printf:106: %\n: invalid directive
printf "$disk_health"
echo를 시도했는데 $name
디스크 이름과 경로가 올바르게 표시됩니다. 또한 및 (백틱 사이) $name
로 바꾸려고 시도했지만 출력은 동일합니다."$name"
echo $name
저는 Debian bookworm에서 zsh를 사용하여 스크립트를 실행하고 있습니다.
답변1
JSON 처리기는 큰따옴표를 유지하며 그대로 전달됩니다 . 옵션을 smartctl
사용하여 제거해야 합니다 .jq
-r
disk_names+=($(jq -r '.blockdevices[] | .name' <<< "$disk_info"))