터미널에서 직접 smartctl을 실행할 때와 스크립트에서 smartctl을 실행할 때 잠재적인 변수 확장 문제를 설명할 수 있는 사람이 있습니까?

터미널에서 직접 smartctl을 실행할 때와 스크립트에서 smartctl을 실행할 때 잠재적인 변수 확장 문제를 설명할 수 있는 사람이 있습니까?

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/nvme0n1printf:106: %\n: invalid directiveprintf "$disk_health"

echo를 시도했는데 $name디스크 이름과 경로가 올바르게 표시됩니다. 또한 및 (백틱 사이) $name로 바꾸려고 시도했지만 출력은 동일합니다."$name"echo $name

저는 Debian bookworm에서 zsh를 사용하여 스크립트를 실행하고 있습니다.

답변1

JSON 처리기는 큰따옴표를 유지하며 그대로 전달됩니다 . 옵션을 smartctl사용하여 제거해야 합니다 .jq-r

disk_names+=($(jq -r '.blockdevices[] | .name' <<< "$disk_info"))

관련 정보