매개변수 확장에 누락된 부분이 있는 것 같습니다.

매개변수 확장에 누락된 부분이 있는 것 같습니다.

저는 현재 간단한 스크립트를 작성하는 방법을 배우고 있지만 매우 간단한 문제를 해결할 수 없습니다.

내 스크립트에는 다음 명령이 있습니다 ...

touch ${DIRECTORY}/${FILE}

이 명령은 내 스크립트에 여러 번 나타나며 한 인스턴스를 제외하고 모두 제대로 작동합니다. 어떤 이유에서인지 어느 순간 생성하려는 파일 이름에 슬래시를 포함하기로 결정했는데 오류가 발생했습니다.

cannot touch `/myfile.dat': Permission denied

처음에 나는 이것이 나의 경험 부족 때문일지도 모른다고 생각했습니다(아마 그럴 것입니다). 그러나 약간의 조사 후에 나는 이 라인이 수많은 예에서 잘 작동한다는 것을 발견했습니다. 이해할 수 없습니다. 동일한 줄이 내 스크립트의 다른 여러 위치에서 잘 작동합니다!

누구든지 설명해 주실 수 있나요? 이러한 불일치는 나를 정말 짜증나게 합니다. 해당 특정 명령과 관련된 명령이 결과에 영향을 줍니까?

답변1

비어있는 것 같습니다 ${DIRECTORY}. 이 경우 터치가 ${DIRECTORY}/${FILE}다음으로 확장됩니다.touch /${FILE}

답변2

여러 가지 일이 일어날 수 있습니다.

  • 이 시점에서 오타를 냈을 수도 있으므로 DIRECTORY스크립트가 설정되지 않았기 touch ${DRIECTORY}/${FILE}때문에 is 인 경우 다음과 같이 확장됩니다 (설정되지 않은 변수는 비어 있는 것으로 간주됩니다). 설정되지 않은 변수를 확장하려고 할 때마다 오류 메시지와 함께 셸이 중지될 수 있습니다. 스크립트 상단( 이 줄 뒤) 에 있습니다 . 및 를 사용하여 unset-triggers-error와 unset-is-empty 사이를 앞뒤로 전환할 수 있습니다 .DIRECTORY$FILEmyfile.dattouch /${FILE}
    set -u#!set -uset +u
  • DIRECTORY현재 변수는 설정되지 않았거나 비어 있을 수 있습니다. 이전 항목을 참조하세요.
  • 실수로 공백을 추가했을 수도 있습니다: touch ${DIRECTORY} /${FILE}. 그런 다음 명령 touch은 두 개의 인수를 사용하여 해당 인수에 대해 작동하고 ${DIRECTORY}(기존 디렉터리의 이름일 수 있으므로 해당 디렉터리의 수정 시간을 현재 시간으로 설정함) /${FILE}.
  • 값 끝에 추가 공백이 있을 수도 있습니다 DIRECTORY. 예를 들어, 변수 /some/path값에 후행 공백이 있는 경우 touch두 개의 인수인 /some/path및 를 받습니다 /myfile.dat. 이전 항목을 참조하세요.

DIRECTORYFILE공백이나 와일드카드가 포함되어 있으면 스크립트가 작동하지 않습니다 \[?*. 이는 eg 를 작성할 때 $FOO변수 값으로만 ​​확장되지 않기 때문입니다. 값은 공백의 각 시퀀스에서 단어로 분할되고 각 단어는 와일드카드 패턴으로 해석되어 일치하는 파일 이름으로 대체됩니다( 파일 이름이 일치하지 않으면 패턴이 유지됩니다.)변수 대체(및 마찬가지로 명령 대체)에는 항상 큰따옴표를 사용하십시오.큰따옴표 내에서는 추가 수정 없이 "$FOO"값으로 확장됩니다 .FOO

touch "$DIRECTORY/$FILE"

(당신은 또한 볼 수 있습니다$VAR 대 ${VAR} 및 인용 여부)

스크립트가 수행하는 작업을 더 잘 이해하려면 set -x#!줄 뒤에 넣으세요. 이렇게 하면 셸이 각 명령을 실행하기 전에 인쇄하는 디버그 모드가 활성화됩니다. set -x및 를 사용하여 디버그 추적을 켜거나 끌 수 있습니다 set +x.

관련 정보