![macOS Monterey에서 'sh'를 사용하지 않고 쉘 스크립트를 실행할 때 발생하는 문제](https://rvso.com/image/1672349/macOS%20Monterey%EC%97%90%EC%84%9C%20'sh'%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80%20%EC%95%8A%EA%B3%A0%20%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%8B%A4%ED%96%89%ED%95%A0%20%EB%95%8C%20%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94%20%EB%AC%B8%EC%A0%9C.png)
저는 쉘 스크립팅과 일반적으로 터미널 사용법을 처음 접했습니다. 최근에 script.sh
전체 경로 없이 이름만 입력하여 사용하고 싶은 을(를) 만들었습니다 . 그래서 디렉토리 경로를 다음 .zprofile
과 같이 썼습니다.
export "PATH=$PATH:/path/to/scriptdirectory"
다음을 사용하여 파일 권한을 변경했습니다.
% chmod +x script.sh
다음과 함께 스크립트를 사용하는 경우:
% sh myscript.sh
모든 것이 의도한 대로 원활하게 진행됩니다. 그러나 and를 생략하려고 하면 sh
다음과 같이 입력합니다.
% myscript.sh
스크립트는 변수를 읽는 첫 번째 부분을 실행하기 시작하지만 값을 삽입하자마자 다음 줄이 나타납니다.
/path/to/scriptdirectory/script.sh:11: = not found
스크립트는 다음과 같습니다.
#!/bin/zsh
echo "Do you want to set or change the backup location? (type y/n)"
read SET_BACKUP
while [ "$SET_BACKUP" != "y" ] && [ "$SET_BACKUP" != "n" ]
do
echo "Please, write y or n:"
read SET_BACKUP
done
if [ "$SET_BACKUP" == "y" ]
then
echo "Write the absolute path of the desired backup location:"
read BACKUP_FOLDER
echo "Starting backup..."
cp -R "/fileslocation" "$BACKUP_FOLDER"
echo "Backup completed."
else
echo "Starting backup..."
cp -R "/fileslocation" "$BACKUP_FOLDER"
echo "Backup completed."
fi
답변1
차이점은 두 개의 서로 다른 쉘 인터프리터를 사용하여 스크립트를 실행한다는 것입니다.
을 사용하면 sh myscript.sh
실행 /bin/sh
중이고zsh가 아님. 실행 되면 sh
스크립트를 읽고 myscript.sh
해당 구문에 sh/bash 쉘 규칙을 사용합니다.
just 를 사용하는 경우 myscript.sh
스크립트를 실행하는 데 사용되는 명령은 첫 번째 줄 #!/bin/zsh
(shebang이라고도 함)에 의해 결정됩니다. 따라서 zsh
구문 규칙을 사용하여 실행됩니다 .
이 작업을 수행하는 두 가지 솔루션이 있습니다.
- 대신 bash를 사용하도록 첫 번째 줄을 변경하십시오.
#!/bin/bash
- zsh에서 조건문이 작동하는 방식에 대해 자세히 읽고 깨진 줄을 수정하세요(다음 줄인 것처럼 보입니다
if [ "$SET_BACKUP" == "y" ]
).
답변2
이것은 실제로 답변이 아니며 형식화 된 질문에 가깝습니다.
3가지가 떠오른다:
=
변수 할당에는 : 주위에 공백이 있어서는 안 됩니다 .answer=42
$
에만 익숙하다드-할당하지 말고 변수를 참조하세요. 하지 마세요.$answer=42
- 변수를 인용하십시오.
if [ "$answer" = 42 ]
나는 당신의 마음을 읽으려고 노력하고 있습니다. 질문에 코드를 넣으십시오.
또한,https://shellcheck.net쉘 코드의 유효성을 검사합니다.