Этот вид сообщения обычно происходит из-за поддельной строки хижины, или дополнительный возврат каретки в конце первой строки или BOM в начале его.
Выполненный:
$ head -1 yourscript | od -c
и посмотрите, как это заканчивается.
Это неправильно:
0000000 # ! / b i n / b a s h \r \n
Это неправильно также:
0000000 357 273 277 # ! / b i n / b a s h \n
Это корректно:
0000000 # ! / b i n / b a s h \n
Использовать dos2unix
(или sed
, tr
, awk
, perl
, python
…) для фиксации сценария, если это - проблема.
Вот тот, который удалит оба из BOM и конца CRS:
sed -i '1s/^.*#//;s/\r$//' brokenScript
Вот три сценария, просто показывающие их имя (echo $0
) и наличие следующих соответствующих строк хижины:
correctScript:
0000000 # ! / b i n / b a s h \n
scriptWithBom:
0000000 357 273 277 # ! / b i n / b a s h \n
scriptWithCRLF:
0000000 # ! / b i n / b a s h \r \n
Под ударом, выполняя их покажет эти сообщения:
$ ./correctScript
./correctScript
$ ./scriptWithCRLF
bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory
$ ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom
При выполнении поддельных explicitely вызов интерпретатора позволяет сценарию CRLF работать без любой проблемы:
$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom
Вот поведение, наблюдаемое под ksh
:
$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom
и под dash
:
$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom
Оболочка POSIX (поэтому включает bash
) эквивалентный был бы:
${FOO:-${BAR:-default}}
См. также:
${FOO-${BAR-default}}
вариант, который проверяет, установлена ли переменная или не вместо того, решает ли это к пустой строке или не (который имеет значение в случаях, где переменная установлена, но пуста).
Не непосредственно.
my_str="${var_name:-${another_var:-default}}"