서브쉘에서 여러 변수를 읽는 방법

서브쉘에서 여러 변수를 읽는 방법

Stackexchange에서 비슷한 질문을 찾았지만 도움을 드릴 수 있을 만큼 제 경우에 가깝지는 않습니다.

스크립트를 생성하고 이를 키에 바인딩하여 눌렀을 때 " titleby artist"가 표시되거나 아티스트/제목이 없으면 " filename"가 표시되도록 하려고 합니다.

Cmus(내가 선택한 음악 플레이어) 는 (원본) 옵션 cmus-remote과 쌍을 이루 -C므로 cmus 플레이어에 무엇이든 쿼리하고 개행으로 구분된 응답을 얻을 수 있습니다. 예를 들면 다음과 같습니다.

cmus-remote -C 'format_print %a %t %F'
Beach House
Space Song
/home/user/Music/Beach House - Space Song.mp3

cmus-remote문제는 모든 쿼리를 실행하고 싶지는 않지만

IFS= read -r artist title file << EOF
$(cmus-remote -C 'format_print %a %t %F')
EOF

그러나 artist및 만 제공되며 title및 는 비어 있습니다. 참고: 이 경우 옵션을 file제거해 도 도움이 되지 않습니다 . 을 수정하십시오.-rIFS

자세한 설명: 내 음악 폴더에 태그가 완전히 지정되지 않았습니다. 즉, 일부 노래에는 아티스트나 제목이 없으므로 이 스크립트의 아이디어는 제목이나 아티스트가 없으면 "Now Playing title" 실행에 알림을 보내는 것입니다. artist" filename따라서 보낼 알림을 평가하려면 세 가지 변수가 필요합니다.

답변1

각 개행 문자를 읽어야합니다.

cmus-remote -C 'format_print %a %t %F' | 
while IFS= read -r artist; IFS= read -r title; IFS= read -r file
do
  echo "a:$artist"
  echo "t:$title"
  echo "f:$file"
done

한 번 실행하고 올바른 값을 에코하는 이유 IFS=$'\n'는 생각한 대로 작동하지 않는 이유는 제 능력 밖의 일입니다. 세 번째 읽기를 허용하겠습니다.

관련 정보