Установка переменной оболочки пустым способом объединения

Этот вид сообщения обычно происходит из-за поддельной строки хижины, или дополнительный возврат каретки в конце первой строки или 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
23
24.01.2013, 00:40
2 ответа

Оболочка POSIX (поэтому включает bash) эквивалентный был бы:

${FOO:-${BAR:-default}}

См. также:

${FOO-${BAR-default}}

вариант, который проверяет, установлена ли переменная или не вместо того, решает ли это к пустой строке или не (который имеет значение в случаях, где переменная установлена, но пуста).

32
27.01.2020, 19:41

Не непосредственно.

my_str="${var_name:-${another_var:-default}}"
5
27.01.2020, 19:41

Теги

Похожие вопросы