Intereting Posts
Перезапуск всей сети в Ubuntu после спящего режима Как определить, использует ли плата Linux аппаратное FPU или нет? Временно ограничьте логины для пользователя одним IP sed – извлечь значение путем подстановки из первой строки, соответствующей второй регулярной линии, следующей строке с 1-м регулярным выражением OpenWRT перенаправляет трафик на основе запрашиваемой пары домен / порт gsed: команда не найдена на macOS с Homebrew Открыть список файлов в vim для определенных строк Не удается установить postfix yum на Fedora 20 Как удалить строку между двумя строками? Найти файлы и рекурсивно добавить текст к ним Удаленное обнаружение имени хоста и IP-адреса скрипт bash с выражением case не возвращает результат Отчеты каталогов с содержимым, которое существует в другом месте, даже если они разбросаны Проверьте, установлен ли CVE-2016-10229 на моем Linux-сервере XEN Debian Ошибки в менеджере обновлений Mint Linux

Терминал не принимает вставленные или напечатанные строки длиной более 1024 символов

Когда я вводю текст на stdin в терминале OS X, одна строка ограничена 1024 символами. Например, cat > /dev/null подает звуковой сигнал после того, как я набираю (или вставляю) строку дольше, чем это, и отказывается принимать больше символов. Проблемным примером является то, когда я хочу подсчитать символы из вложенного текста с cat | wc -c cat | wc -c : cat блокируется на первой длинной линии.

Кажется, это общая проблема при вставке в stdin. Может ли это наблюдаемое ограничение stdin на 1024 символа на строку быть удалено или перенесено на более высокий предел?

Мне нужно это, потому что я хочу вставить текст с длиной более 1024 символов.

Я мог бы также использовать «heredoc» << EOT и вставлять мои длинные строки без каких-либо проблем, но затем текст появляется в моей истории оболочки, чего я не хочу.

Вероятно, это ограничение для внутреннего буфера редактора строки линии терминала.

Вы должны иметь возможность вводить длинные строки, нажав Ctrl + D в середине (так что текущая введенная часть будет отправлена ​​в cat а редактор строк – покраснел) или вообще отключив этот редактор строк.

Например, если вы используете zsh :

 STTY=-icanon cat > file 

Обратите внимание, что тогда вы не можете использовать Backspace или любые другие возможности редактирования. Вам также нужно нажать Ctrl-C, чтобы остановить cat .

С другими оболочками:

 s=$(stty -g); stty -icanon; cat > file 

С последующим:

 stty "$s" 

Или просто:

 stty -icanon; cat > file stty sane 

Конечно, такие вещи, как

 cat | wc -l 

или

 wc -l 

не будет работать. Поскольку Ctrl + C убивает все процессы в группе процессов переднего плана.

Вы можете сделать:

 STTY=-icanon cat | (trap '' INT; wc -l) 

Или, как было предложено @mikeserv :

 STTY='eol " "' wc -l 

Таким образом, буфер будет очищаться каждый раз, когда вы вводите пробел. Вы все еще в каноническом режиме, поэтому вы можете редактировать слова (в отличие от строк) и использовать Ctrl + D для обозначения EOF.

Или:

 STTY='-icanon min 0 time 30' wc -l 

EOF наступит через 3 секунды после того, как вы перестанете печатать. Или:

 STTY=-icanon sed -n '/^EOF$/q;p' | wc -l 

И введите EOF (3 буквы на отдельной строке), чтобы закончить ввод.

Как было предложено Жилем , где это возможно (например, как правило, это не сеанс telnet / ssh), используйте pbpaste вместо вставки. (Это на OSX, в X11 вызовите xsel или xclip .):

 pbpaste | wc -l 

Это также позволит избежать проблем с некоторыми управляющими символами (например, ^C ), которые могут быть найдены в буфере копирования-вставки.