다음은 내 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
, 이는 스크립트의 작업 순서도 표시합니다.