저는 현재 간단한 스크립트를 작성하는 방법을 배우고 있지만 매우 간단한 문제를 해결할 수 없습니다.
내 스크립트에는 다음 명령이 있습니다 ...
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
$FILE
myfile.dat
touch /${FILE}
set -u
#!
set -u
set +u
DIRECTORY
현재 변수는 설정되지 않았거나 비어 있을 수 있습니다. 이전 항목을 참조하세요.- 실수로 공백을 추가했을 수도 있습니다:
touch ${DIRECTORY} /${FILE}
. 그런 다음 명령touch
은 두 개의 인수를 사용하여 해당 인수에 대해 작동하고${DIRECTORY}
(기존 디렉터리의 이름일 수 있으므로 해당 디렉터리의 수정 시간을 현재 시간으로 설정함)/${FILE}
. - 값 끝에 추가 공백이 있을 수도 있습니다
DIRECTORY
. 예를 들어, 변수/some/path
값에 후행 공백이 있는 경우touch
두 개의 인수인/some/path
및 를 받습니다/myfile.dat
. 이전 항목을 참조하세요.
DIRECTORY
FILE
공백이나 와일드카드가 포함되어 있으면 스크립트가 작동하지 않습니다 \[?*
. 이는 eg 를 작성할 때 $FOO
변수 값으로만 확장되지 않기 때문입니다. 값은 공백의 각 시퀀스에서 단어로 분할되고 각 단어는 와일드카드 패턴으로 해석되어 일치하는 파일 이름으로 대체됩니다( 파일 이름이 일치하지 않으면 패턴이 유지됩니다.)변수 대체(및 마찬가지로 명령 대체)에는 항상 큰따옴표를 사용하십시오.큰따옴표 내에서는 추가 수정 없이 "$FOO"
값으로 확장됩니다 .FOO
touch "$DIRECTORY/$FILE"
(당신은 또한 볼 수 있습니다$VAR 대 ${VAR} 및 인용 여부)
스크립트가 수행하는 작업을 더 잘 이해하려면 set -x
이 #!
줄 뒤에 넣으세요. 이렇게 하면 셸이 각 명령을 실행하기 전에 인쇄하는 디버그 모드가 활성화됩니다. set -x
및 를 사용하여 디버그 추적을 켜거나 끌 수 있습니다 set +x
.