#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
이 bash 스크립트는 Ubuntu에서 잘못된 대체 오류를 발생시킵니다. 도움을 주시면 감사하겠습니다.
답변
/bin/sh
우분투 아래 의 기본 쉘 ( )은 dash
아닌을 가리 킵니다 bash
.
me@pc:~$ readlink -f $(which sh)
/bin/dash
따라서을 사용 chmod +x your_script_file.sh
하여 실행하거나을 사용하여 ./your_script_file.sh
실행하면 bash your_script_file.sh
제대로 작동합니다.
sh your_script_file.sh
hashbang 행이 무시되고 스크립트가 dash
해당 문자열 대체 구문을 지원하지 않는 로 해석되므로이 스크립트를 실행하면 작동 하지 않습니다.
답변
나는 같은 문제가 있었다. 스크립트에없는 것이 있는지 확인하십시오
#!/bin/sh
스크립트 상단에 대신에
#!/bin/bash
답변
여기에 도착하는 다른 사람들에게는 명령에 env 변수 구문을 사용할 때 정확한 메시지가 ${which sh}
아닌 정확한 메시지가 나타납니다.$(which sh)
답변
스크립트 구문은 유효한 bash이며 좋습니다.
실패의 가능한 원인 :
-
당신
bash
은 실제로 bash가 아니지만ksh
bash의 매개 변수 대체를 이해하지 못하는 다른 쉘입니다. 스크립트가 잘 보이고 bash와 함께 작동하기 때문입니다. 수행ls -l /bin/bash
하고 정말 bash에 그리고 다른 쉘에 연결된 SYM 확인하세요. -
시스템에 bash가 있으면 스크립트를 잘못된 방식으로 실행할 수 있습니다.
ksh script.sh
또는sh script.sh
기본 쉘은 bash가 아닙니다. 당신은 적절한 shebang을 가지고 있기 때문에, bash가./script.sh
있거나bash ./script.sh
괜찮다면.
답변
스크립트를 실행 파일로 실행하는 대신 bash 명령을 사용하여 명시 적으로 스크립트를 실행하십시오.
답변
또한 스크립트의 첫 줄에 빈 문자열이 없는지 확인하십시오.
즉 #!/bin/bash
, 스크립트의 첫 번째 줄 인지 확인하십시오 .
답변
귀하의 예와 관련이 없지만 Bad substitution
Bash가 인식하지 못하는 대체 구문에 대해 Bash에서 오류가 발생할 수도 있습니다 . 이것은 다음과 같을 수 있습니다 :
- 길쭉한 공백. 예 :
bash -c '${x }'
- 오타. 예 :
bash -c '${x;-}'
- 최신 Bash 버전에 추가 된 기능입니다. 예
bash -c '${x@Q}'
를 들어 Bash 4.4.
동일한 식에 여러 개의 치환이있는 경우 Bash는 문제가있는 식을 정확히 찾아내는 데 큰 도움이되지 않을 수 있습니다. 예 :
$ bash -c '"${x } multiline string
$y"'
bash: line 1: ${x } multiline string
$y: bad substitution