파일이 압축 해제되기 전에 쉘 스크립트가 계속됩니다.

파일이 압축 해제되기 전에 쉘 스크립트가 계속됩니다.

다음은 내 Mac에서 작성한 스크립트입니다(bourne 쉘 "sh" 사용). 이것은 더 큰 스크립트의 일부입니다.

목표: zip 파일이 있고 zip 파일 이름을 미리 알고 있습니다. 그래서 zip 파일을 /tmp/sampleFolder에 추출하고 싶습니다. 그런 다음 해당 폴더를 확인하여 내가 예상하는 파일 이름이 폴더에 있는지 확인하고 싶습니다.

예를 들어 zip에 있는 파일 중 하나가 john.txt인 경우 확인하고 싶습니다.

/tmp/sampleFolder/john.txt

존재하다.

문제: 이상하게도 압축 해제가 완료되기 전에 파일 존재 여부를 확인하는 것 같습니다. 스크립트 상단에 set -e를 추가하여 이 문제를 해결할 수 있었습니다. 그러면 스크립트에 있는 모든 명령이 순서대로 실행되는 것 같습니다. 그러나 이것이 왜 문제를 해결하는지 이해하지 못합니다.

나는 매우 감사할 것입니다:

a.) 압축을 풀기 전에 파일이 존재하는지 확인하는 대체 솔루션/설명

b.) 또는 set -e가 스크립트를 순차적으로 실행하도록 강제하는 이유를 설명하세요. set -e에 대한 내 연구에 따르면 명령이 0이 아닌 값을 반환하면 스크립트가 강제로 종료됩니다. 그러나 그냥 종료하는 대신 스크립트가 순차적으로 실행됩니다. 그래서 할 일이 더 많아진 것 같습니다. 감사합니다!

#!/bin/sh

rm -rf "/tmp/sampleFolder"

unzip ~/Desktop/myFile.zip -d "/tmp/sampleFolder"

if [ ! -r /tmp/sampleFolder/john.txt ]; then
echo "file not present!"
fi

답변1

게시된 스크립트의 명령문을 비순차적으로 실행할 수는 없다고 생각합니다.

다음은 내 Mac에서 작성한 스크립트입니다(bourne 쉘 "sh" 사용). 이것은 더 큰 스크립트의 일부입니다.

실제로 문제가 있는 경우 더 큰 스크립트에 문제가 있을 가능성이 높으므로 단순화된 예에는 표시되지 않습니다.

답변2

쉘 스크립트는 항상 순차적으로 실행됩니다. Set -e는 작업 순서에 영향을 주지 않으며 0이 아닌 경우에만 종료됩니다.

"순서대로"에 대한 예외는 &여기에 존재하지 않는 것 같은 백그라운드 작업을 수행하는 데 사용할 때입니다.

감압이 예상대로 작동하지 않는 것 같습니다. 먼저 echo $?다음 줄에 unzip의 반환 코드를 에코하여 성공하는지 확인해보세요. ls -l /tmp/sampleFolder내용을 보려면 나중에 추가하세요 .
실행하여 bash의 추적 출력을 볼 수도 있으며 set -x, 이는 스크립트의 작업 순서도 표시합니다.

관련 정보