명령줄에서 cp를 실행했지만 스크립트에서 파일을 찾을 수 없습니다.

명령줄에서 cp를 실행했지만 스크립트에서 파일을 찾을 수 없습니다.

다음을 포함하는 디렉토리 구조를 재구성하는 스크립트가 있습니다.

files=./*"$pattern"I{"$ifirst".."$ilast"}.ext
cp ${files} ../"$pattern"/"$i"/

스크립트를 실행하면 오류가 발생합니다.

./*S6I{001..129}.ext: No such file or directory

그러나 명령을 에코한 다음 터미널에 복사하여 붙여넣으면 예상한 동작이 나타납니다.

cp ./*S6I{001..129}.ext ../S6/1/

스크립트에서 이것이 올바르게 실행되지 않는 이유는 무엇입니까?

답변1

확장 순서로 인해 스크립트가 예상대로 작동하지 않습니다.

Bash 매뉴얼에서:

확장 순서는 중괄호 확장, 매개변수 및 변수 확장, 산술 확장, 명령 대체(왼쪽에서 오른쪽으로 수행됨)입니다.

보시다시피 중괄호 확장이 먼저 오고 변수 확장이 마지막에 옵니다. 과제에서는 중괄호 확장이 수행되지 않습니다. 그렇지 않으면 표현식 x={1,2}이 로 확장되며 x=1 x=2이는 역시 의미가 없습니다.

발견한 대로 한 가지 해결책은 eval전체 확장이 두 번 수행되므로 첫 번째 변수 확장이 두 번째 중괄호 확장 전에 수행되는 것입니다.

위험을 이해했는지 확인 eval하고 특히 신뢰할 수 없는 입력에는 절대로 사용하지 마십시오.

Bash를 사용하면 배열을 사용할 수 있습니다.

files=( ./*"$pattern"I{"$ifirst".."$ilast"}.ext )
cp "${files[@]}" ../"$pattern"/"$i"/

관련 정보