개발 중인 bash 스크립트를 라인 1부터 시작하여 한 줄씩 철저하게 테스트해야 한다는 것을 깨달았습니다.
컴패니언 터미널 세션 시작
수직 분할 화면, 왼쪽의 emacs 편집 bash 스크립트, 오른쪽의 bash 스크립트 명령 보기, 오른쪽에서 측면 편집 내용을 한눈에 즉시 볼 수 있음 - 한 화면에서 다른 화면으로 또는 작업장에서 작업장으로의 수동 조수 전환 종료
bash 스크립트, 변수 블록, 연관 배열 정의
*'구문 오류: '(' 예상치 못한' 오류 메시지와 함께 스크립트가 제대로 작동하지 않습니다.*
연구 결과 이 오류는 쉘이 연관 배열을 사용할 수 없는 경우 발생하는 것으로 나타났습니다. sh는 사용할 수 없고 bash는 사용할 수 있습니다.
화면을 종료하고 순수 bash로 돌아가서 bash 스크립트를 실행하고 제대로 작동하는지 확인하세요.
질문: 화면 명령이 "sh" 대신 "bash" 셸에 의존하도록 하는 방법이 있습니까? 이 전환을 발생시키는 옵션이 있습니까? --쉘=배시? 기본적으로 이것이 필요한 것입니다.
고쳐 쓰다
콘스탄틴 AB가 옳습니다. 알고 보니, 어쨌든 Shebang을 다른 곳에 두는 것이 기술적으로 필요하지만 스크립트의 첫 번째 줄에 두는 것이 좋습니다. 물론 줄의 시작 부분에 전체 파일의 첫 번째 문자 집합이 됩니다. 그리고 기본적으로 행 1에 설정하고 다른 모든 항목은 행 2 이상에 남겨두는 것이 좋습니다.
내 실수는 물론 bash shebang을 설정했지만 10번째 줄 주석 섹션 다음인 11번째 줄에 설정했기 때문에 1번째 줄에는 설정하지 않았다는 것입니다.
예:
앞으로
emacs /tmp/test-script.sh (실행파일 설정 후 아래와 같이 저장)
# Super important stuff in need of being mentioned at the top
#!/bin/bash
declare -A asso_array=(
[var1]=""
[var2]="Seems to work"
[var3]="Test"
[var4]=""
)
echo ${asso_array[@]}
echo "Hello World!"
/tmp/test-script.sh 보기
Every 2.0s: /tmp/test-script.sh Sat Jan 20 14:02:11 2024
/tmp/test-script.sh: 4: /tmp/test-script.sh: Syntax error: "(" unexpected
뒤쪽에
emacs /tmp/test-script.sh (실행파일 설정 후 아래와 같이 저장)
#!/bin/bash
# Super important stuff in need of being mentioned at the top
declare -A asso_array=(
[var1]=""
[var2]="Seems to work"
[var3]="Test"
[var4]=""
)
echo ${asso_array[@]}
echo "Hello World!"
참고: shebang을 라인 1에 넣으면 경로 끝점(이 경우 "bash")이 강조 표시됩니다!
/tmp/test-script.sh 보기
Every 2.0s: /tmp/test-script.sh Sat Jan 20 14:05:11 2024
Test Seems to work
Hello World!
그럼, 배운 교훈을 검토해 보겠습니다.
우선 시방! 에 관계없이!
이는 bash 스크립트의 기술적 필요성입니다.
그것을 끝내면 bash 스크립트는 기본적으로 실패합니다.
답변1
스크립트를 bash 스크립트로 표시해야 합니다.
이는 오른쪽부터 시작하여 수행됩니다.셰르본라인”, 이 경우
#! /bin/bash
이는 스크립트가 런타임에 bash에 의해 실행되고 다른 어떤 것에 의해서도 실행되지 않는다는 것을 시스템에 알려줍니다.
답변2
현재 허용되는 답변은 OP가 BASH 스크립트를 실행하려고 시도한다고 가정합니다. 실제로 그렇습니다. 그러나 OP의 질문은 스스로에게 묻습니다. screen
따라서 OP의 경우가 아닌 질문에 별도로 대답하려면 다음을 수행하십시오.
$ screen --help | grep SHELL
-s shell Shell to execute rather than $SHELL.
E.g.
$ screen -s bash -S myBashySessionName