Также на случай, если вы подаете -я дам вам неизвестное
Вы можете использовать эту команду php, которая может угадать кодировку, как показано ниже:
В php вы можете проверить, как показано ниже:
Явное указание списка кодировок:
php -r "echo 'probably : '. mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1'). PHP_EOL;"
Более точные "мб _список _кодировки ":
php -r "echo 'probably : '. mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()). PHP_EOL;"
Здесь, в первом примере, вы можете видеть, что я помещаю список кодировок (определяю порядок списка ), который может совпадать. Чтобы получить более точный результат, вы можете использовать все возможные кодировки через:mb _список _кодировки()
Примечание mb _*для функций требуется php -mbstring
apt-get install php-mbstring
Попробуйте использовать heredoc, их довольно легко вырезать и вставлять:
script.sh arg arg arg <<'END_INPUT'
line1
line2
line3
END_INPUT
Скорее всего, то, что вы наблюдаете, зависит от редактирования строки и режима, в который ваша оболочка устанавливает терминал.
При вставке текста
cat
a
b
(включая новую строку после «b» )в командную строку интерактивного сеанса Bash, по умолчанию он находит терминал, установленный в необработанный режим — как это происходит, когда редактирование строки обеспечивается библиотека GNU Readline ; это означает, что, среди прочего, ввод отправляется в оболочку посимвольно (, а не построчно ), преобразование символов возврата каретки (\r
, что видит терминал, когда Enter нажимается или вставляется новая строка в командную строку )в символы перевода строки(\n
)отключено, и введенные символы отображаются в командной строке самой оболочкой (, а не терминалом ).
Затем оболочка читает первую строку, находит, что это полная простая команда (cat
), и запускает ее. При этом он также отключает редактирование собственной строки, переводя терминал в режим приготовления и разрешая преобразование \r
→ \n
. Однако в этот момент входной буфер уже содержит a\rb\r
, что считывается с помощью cat
и выводится на экран. Если вы затем нажмете Ctrl + D (^D
), cat
выйдет и будет напечатано новое приглашение, перезаписывающее (только )напечатанную строку (, потому что она заканчивается возврат каретки ).
Обратите внимание, что:
Если вместо cat
вы вызываете программу, которая читает из стандартного ввода в цикле, что эквивалентно сценарию
while IFS= read -r foo
do
# Accumulate the content of foo
done
он ничего не будет читать, пока вы не нажмете Enter , потому что во входном буфере нет символа \n
(, если вставляемые данные не превышают размер входного буфера терминала, см. ниже ).
После вставки текст (b
, в данном случае ), который вы видите в строке, следующей за командой, не является эхом вставленного содержимого,но вывод cat
. В этом легко убедиться, например, вставив
od -An -tc
a
b
Вставка в оболочку run как strace -f -e read,write bash
также может помочь понять, что происходит.
Если вставленный текст, предназначенный для чтения со стандартного ввода, «достаточно» (в моей системе, более 4095 символов; см. «Канонический и неканонический режим» в man 3 termios
), то, что написано выше, относится только к первому чтению размером 4095 байт -— то, что терминал помещает в свой входной буфер, когда находится в необработанном режиме, самое большее. Последующие чтения происходят в подготовленном режиме, происходит преобразование \r
→ \n
, и эта часть вставленного текста отражается в командной строке (и, вероятно, смешивается с выводом команды ).
В принципе, это поведение можно изменить, отключив редактирование строк в Bash:
$ set +o emacs
$ set +o vi
$ cat # Pasting the above snippet here
a
b
a
b
$ # ^D makes cat exit and brings the prompt back
Обратите внимание, однако, что длинный ввод все равно будет смешиваться с выводом, потому что терминал не может сказать оболочке подождать, пока операция вставки не завершится, прежде чем начать ее обработку, если только не включена «вставка в квадратных скобках» (см. ниже ).
zsh
кажется немного проще. Единственная ловушка:"вставка в квадратных скобках" , вероятно, включена по умолчанию. Это позволяет вам вставлять многострочные команды -в командную строку, выполняя их, как если бы они были сценарием, при этом гарантируя, что специальные символы (, например. табуляции, новые строки )обрабатываются правильно. Это также означает, что при задании
cat
a
b
zsh
считывает три строки и выполняет cat
, ожидая нового ввода с терминала; когда cat
выходит, оболочка пытается запустить a
(, что терпит неудачу, если только такая команда не существует в вашей системе ), затем b
.
Отключение вставки в квадратных скобках обеспечивает поведение, которое вы, кажется, ищете (, но, по сравнению с bash
без редактирования строки, по умолчанию zsh
не повторяет вставленное содержимое,за исключением части, превышающей первые 4095 байт (, см. маркированный список выше)):
% unset zle_bracketed_paste
% cat # Pasting the above snippet here
a # cat prints these two lines
b
% # ^D makes cat exit and brings the prompt back