Проблема со вставкой команд оболочки Linux

Также на случай, если вы подаете -я дам вам неизвестное

Вы можете использовать эту команду 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 

См. ответ:https://stackoverflow.com/a/57010566/3382822

0
17.05.2021, 23:49
2 ответа

Попробуйте использовать heredoc, их довольно легко вырезать и вставлять:

script.sh arg arg arg <<'END_INPUT'
line1
line2
line3
END_INPUT
3
28.07.2021, 11:31

Скорее всего, то, что вы наблюдаете, зависит от редактирования строки и режима, в который ваша оболочка устанавливает терминал.

При вставке текста

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
0
28.07.2021, 11:31

Теги

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