Сценарий оболочки
По умолчанию оболочка не рассматривает CR как пробел.
Исходный код (crlf67.sh
) с CR, отмеченным ^M
:
#!/bin/sh^M
^M
echo "Hello^M
World!"^M
Явное выполнение команды:
$ sh crlf67.sh
: command not found
Hello
World!
$ sh crlf67.sh 2>&1 | vis -r
crlf67.sh: line 2: ^M: command not found
Hello^M
World!^M
$
(Команда vis
является расширенной версией программы vis
от Брайана В. Кернигана, Роба Пайка Среда программирования Unix (Ноябрь 1983). Это делает непечатные символы видимыми.)
Если вы сделаете скрипт исполняемым:
$ make crlf67
cat crlf67.sh >crlf67
chmod a+x crlf67
$ crlf67
-bash: ./crlf67: /bin/sh^M: bad interpreter: No such file or directory
$
Ядро также не рассматривает CR как пробел и завершается ошибкойчтобы найти команду.
Исходный код C
Официально в исходном коде C нельзя использовать обратную косую черту для продолжения строк в C, если конец строки - CRLF, поскольку символ после обратной косой чертыне перевод строки (NL или LF);это ЧР.Некоторые компиляторы игнорируют пробелы (по крайней мере, CR) после последнего обратного слеша в строке - GCC 9.1.0 для одной, но также и более ранних версий.Он предупреждает о пробелах после завершающей обратной косой черты (если вы не используете -Werror
, как я, тогда это ошибка).Это не то, что предусмотрено стандартом;однако даже -pedantic
не останавливает его, игнорируя ошибочные обозначения.
Исходный код (crlf19.c
) с CR, отмеченным ^M
, и новой строкой, отмеченной ^J
:
#include <stdio.h>^M^J
^M^J
int main(void)^M^J
{^M^J
printf("Hello\ ^M^J
world!\ ^M^J
\n");^M^J
return 0;^M^J
}^M^J
Компиляция по GCC 9.1.0 на macOS 10.14.5 Mojave:
$ gcc -O3 -g -std=c11 -Wall -Wextra -pedantic crlf19.c -o crlf19
crlf19.c: In function ‘main’:
crlf19.c:5:18: warning: backslash and newline separated by space
5 | printf("Hello\
|
crlf19.c:6:8: warning: backslash and newline separated by space
6 | world!\
|
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror crlf19.c -o crlf19
crlf19.c: In function ‘main’:
crlf19.c:5:18: error: backslash and newline separated by space [-Werror]
5 | printf("Hello\
|
crlf19.c:6:8: error: backslash and newline separated by space [-Werror]
6 | world!\
|
cc1: all warnings being treated as errors
$
Это поведение восходит по крайней мере до GCC 4.1.2 - эта версия была протестирована на анту-дилюйском RHEL 5box.
Если вы удалите пробелы после обратной косой черты, оставив только окончания строки CRLF, GCC вообще не будет жаловаться.