Как кошка << 'EOF' произвольных текстовых данных из буфера обмена
Я хочу вставить текст в терминал и сохранить его в файл, не используя редактор, а просто "cat".
Но слишком длинные строки или табуляции в тексте делают это невозможным с помощью простой команды, такой как "cat> test.txt" или "cat << 'EOF'>test.txt" ("здесь документ").
В bash в режиме "здесь документ", если вставленные текстовые данные содержат вкладки, они вызывают автозаполнение.
Если я начинаю bash с "--noediting", в некоторых системах длина вставленной строки ограничена 256 символами, остальная часть вставленного текста отбрасывается.
Если вместо этого я вставлю непосредственно в кошачий ввод (без << 'EOF'), максимальная строка также 256.
Если я сделаю:
stty raw; cat >test.txt; stty sane
длина строки больше не ограничена, но нет способа отправить EOF на вход cat.
Если я включу eof char:
stty raw icanon eof '^d'; cat >test.txt; stty sane
длинные строки потеряны.
Кроме того, если я не отключить эхо с:
stty -echo
Сочетание Solaris 10 и Putty приводит к потере больших блоков текста ~1500 символов, что иногда приводит к пустому файлу.
Самое близкое, чего я хочу, это убить кота с тайм-аутом:
( sleep 15; pkill cat ) & stty raw -echo; cat >test.txt; stty sane; echo done
или использовать bash --noediting с raw:
bash --noediting
stty raw -echo icrnl
cat <<'EOF' >test.txt; stty sane
1 ответ
Если вы используете bash, вы можете отключить завершение табуляции перед вставкой, а затем снова включить его, используя bind
команда:
bind '\C-i:self-insert'
# paste away
bind '\C-i:complete'
Это громоздко, но это работает.
При вводе вручную в командной строке bash вы можете открыть буквенную вкладку, сначала нажав CTRL-V, а затем вкладку. Очевидно, что вы не можете сделать это при вставке, и меня это раздражало настолько, что я исправил свою любимую терминальную программу iTerm2 командой "Специальная вставка", которая отправляет буквенные вкладки через последовательность вкладок CTRL-V.
Я только сегодня вечером написал и отправил этот патч, так что если вы хотите версию iTerm2, которая делает это, вам придется скомпилировать свою собственную версию из моего форка на GitHub с использованием Xcode. Надеюсь, он будет объединен с основным приложением, если я это сделаю, я обновлю этот ответ. РЕДАКТИРОВАТЬ: изменения, которые я сделал, теперь в основной ветке iTerm2. Используйте команду Edit -> Paste with Literal Tabs.
Если вы используете другую ОС или терминальную программу, извините, я не могу помочь с этим.