Символы-паразиты в bash-скриптах.

Автор orlyanuch, 15 августа 2011, 14:10:28

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

orlyanuch

Второй раз столкнулся с такой проблемой.
При копировании текста скрипта из литературы и его запуске выпадает ошибка:
Цитировать./test_script.sh:  line 1: #!/bin/bash: Нет такого файла или каталога
При просмотре скрипта в текстовых редакторах не выявлено никаких ошибок (пробовал в разных).
Лишние символы становятся видны лишь с помощью
less test_script.sh
или
cat -v test_script

Пример во вложенном файле.

Если скрипт небольшой, то можно и перепечатать. Но что делать, если он на много килобайт?
Вырезание первой строки текстовыми редакторами не помогает, копирование со второй строки и вставка в новый - тоже.
Помогло следующее:
любым редактором вставить в начало пустую строку, сохранить и выйти, затем:
sed -i '1d' test_script.sh

Короче, sed сразу справился с тем, с чем бился несколько часов.

Извиняюсь, вставить пустую строку катит не со всеми редакторами (с gedit, например). Нужно сразу ввести команду удаления первой строки, которая выше, а потом дописать вначале:
Цитировать#!/bin/bash
Edimus, ut vivamus; nоn vivimus, ut edamus.

orlyanuch

Нашёл информацию, что это за символы:

ЦитироватьКасательно UTF-8 и BOM (Byte-Order Mark, метка порядка байтов)

В общем: в Unix тексты в кодировке UTF-8 не используют метки порядка байтов. Кодировка текста определяется по локали, mime-типу файла, или по каким-то другим метаданным. Хотя наличие BOM не испортит UTF-8 документ в плане его читаемости человеком, могут возникнуть проблемы с автоматической интерпретацией таких файлов в качестве скриптов, исходных кодов, файлов конфигурации и т.д. Файлы, начинающиеся с BOM, должны рассматриваться как чужеродные, так же как и файлы с DOS'овскими переносами строк.

В шелл-скриптах: «Там, где UTF-8 может прозрачно использоватся в 8-битных окружениях, BOM будет пересекаться с любым протоколом или форматом файлов, предполагающим наличие символов ASCII в начале потока, например, #! в начале шелл-скриптов Unix»
http://unicode.org/faq/utf_bom.html#bom5

Источник: http://bappoy.pp.ru/2008/12/24/bash-pitfalls-part04.html
Edimus, ut vivamus; nоn vivimus, ut edamus.