N_TTY_BUF_SIZE
. Значение [1173517] [1173518] равно 4096.
Это ограничение терминального интерфейса, а именно [1173519] канонический ("cooked") режим [1173520], который обеспечивает чрезвычайно грубый строчный редактор (обратное пространство, ввод, [1173521]Ctrl[1173522]+[1173523]D[1173524] в начале строки для конца файла). Это происходит полностью вне процесса чтения.
Вы можете переключить терминал в режим raw, который отключает обработку строк. Также он отключает [1173525]Ctrl[1173526]+[1173527]D[1173528] и другие приятные моменты, что ложится дополнительным бременем на вашу программу.
Например, чтобы использовать содержимое буфера обмена X, трубы изxsel
или
xclip
. В вашем случае:
Удалите [1173533]-b[1173534] или [1173535]-выберите буфер обмена[1173536], чтобы использовать выделение Х (которое устанавливается путем выделения с помощью мыши), а не буфер обмена.
В OSX используйте
pbpaste
для вставки содержимого буфера обмена (и [1173539]pbcopy[1173540] для его установки).
Вы можете получить доступ к буферу обмена X через SSH, если вы активируете переадресацию X11 с помощью [1173541]ssh -X[1173542] (что может быть запрещено некоторыми серверами). Если вы можете использовать [1173543]ssh[1173544] без переадресации X11, вы можете использовать [1173545]scp[1173546], [1173547]sftp[1173548] или [1173549]sshfs[1173550] для копирования файла.
Если вставка является единственным решением, потому что вы не можете переслать буфер обмена или вы не вставляете, но, например, подделываете набор текста в виртуальной машине, альтернативный подход заключается в кодировании данных во что-то, что имеет новые строки. [1173551]Base64[1173552] хорошо подходит для этого: он преобразует произвольные данные в символы для печати и игнорирует пробелы при декодировании. Дополнительным преимуществом такого подхода является поддержка произвольных данных на входе, даже управляющих символов, которые терминал будет интерпретировать при вставке. В вашем случае вы можете кодировать содержимое:
затем декодировать:
Для меня загадка в том, почему, поскольку вы уже продемонстрировали, что знаете о [1172753]xclip[1172754], вы не просто используете [1172755]xclip -o > file[1172756] вместо [1172757]cat
cat[1133801] будет принимать любое количество символов, как вы могли бы наблюдать, делая, например, [1133802]cat /dev/random > test.bin[1133803] (не делайте этого, если не знаете, как это остановить :). Я попытался скопировать и вставить [1133804]большой файл[1133805] в [1133806]cat > test.txt[1133807]. Все строки попадали в файл независимо от того, отменял ли я их с помощью [1133808]Ctrl[1133809]-[1133810]c[1133811] или [1133812]Ctrl[1133813]-[1133814]d[1133815], но в первом случае [1133816]не все строки были распечатаны в терминал[1133817]. Я считаю, что это связано с тем, что [1133818]cat[1133819] буферизирует свою печать, ожидая полного буфера текста или прямого ввода из терминала перед каждой печатью.
1.Restart your computer,
2. run the apps, without restarting your machine now.
3. bring up task manager
4. bring up columns dialog. (View > Columns)
5. select Check CPU time
6. and some IO, (Bytes Read/Bytes Written)
В моей системе, я считаю, что размер буфера составляет 4096 (2^12) байт: Создайте файл размером 4095 байт, используя
(printf '1234567890%.0s' {1...409} && printf 12345) > test.in
, загрузив его в буфер копирования с помощью [1133822]xclip test. in[1133823], запустите [1133824]cat > test.out[1133825], вставьте, используя [1133826]Shift[1133827]-[1133828]Insert[1133829], и завершите поток, нажав [1133830]Ctrl[1133831]-[1133832]d[1133833]. Теперь добавьте байт, используя [1133834]printf '6' >> test.in[1133835], и поток будет распечатан [1133836]-[1133837] дважды: Один раз в выводе [1133838]cat[1133839] (все 4096 байт), и [1133840]последние 4095 байт снова [1133841] на оболочке после завершения.[1133452].
Если вы выполните:
stty eol =
А затем запустите демонстрацию, предложенную в вашем EDIT , вы увидите foo bar в распечатке test.out . Линейная дисциплина терминала будет сбрасывать свой вывод читателю, когда он читает каждый специальный eol char в вашем вводе.
Терминал Linux с каноническим режимом, который можно настроить с помощью stty icanon
или, возможно, просто stty sane
- обрабатывает следующие специальные входные символы ...
^ D
^ U
^ H
(или, возможно, @
или ^?
в некоторых системах) Когда также установлено iexten - например, stty icanon iexten
или, опять же, вероятно, просто stty sane
, канонический терминал Linux также будет обрабатывать ...
^ W
^ R
^ V
Эти символы обрабатываются путем их удаления из входного потока - за исключением eol и eol2 , то есть - и выполнения соответствующей специальной функции перед передачей обработанного потока в считыватель - которая обычно является вашей оболочкой, но может быть любой группой процессов переднего плана.
Другие специальные входные символы, которые обрабатываются аналогичным образом, но могут быть настроены независимо от любого параметра icanon , включают набор isig - набор, например stty isig
и, вероятно, также включен в разумную конфигурацию:
^ \
^ Z
kill -CONT "$!"
или просто fg
в ( set -m
) Снаряд с управляемым заданием. ^ C
И набор ixon - настроен как stty ixon
, а также обычно включается в нормальную конфигурацию:
^ S
^ Q
Специальные символы, обрабатываемые в других системах, отличных от Linux, могут включать ...
^ O
И, возможно ...
^ @
(что означает \ 0
или NUL
) shl
shell-Layers в некоторых системах. shl
, которая мультиплексирует ptys и поэтому совместима с управлением заданиями, а не с зависимым поведением swtch исходной реализации, может быть свободно размещена в семейной реликвии .
набор инструментов. Чтобы получить более четкое представление о том, как и почему (и, возможно, почему нет) , эти функции ввода обрабатываются, обратитесь к man 3 termios
.
Всем вышеперечисленным функциям можно назначить (или переназначить) - если применимо - например, stty
назначенная клавиша функции
.Чтобы отключить любую отдельную функцию, выполните stty
function
^ -
. В качестве альтернативы, как показывают различные попытки с назначением для любой из вышеупомянутых функций редактирования строк со всеми реализациями GNU, AST или семейной реликвии stty
, вы также можете stty
function
^ @
как NUL назначение для любой функции, похоже, приравнивается к установке его на unassigned в моей системе Linux.
Вероятно, вы видите эхо этих символов, когда набираете их (что, вероятно, можно настроить с помощью [-] ctlecho ) , но это является лишь маркером, показывающим вам, где вы это сделали - программа, получающая ваш ввод, не знает, что вы набрали их (за исключением eol [2] , то есть) и получает только копию вашего ввода, к которому линейная дисциплина применила свои эффекты.
Следствием обработки терминалом различных функций редактирования строк является то, что ему необходимо до некоторой степени буферизовать ввод, чтобы действовать в соответствии с функциями, которые вы указываете ему, что он должен - и поэтому не может быть безграничного предложения. ввода, который вы можете в любой момент убить . Буфер строки более точно является буфером уничтожения .
Если вы установите символы eol или eol2 на некоторый разделитель, который встречается при вводе - даже если ни один из них не является, например, новой строкой или символом возврата - тогда вы будете возможность kill до момента, когда это произошло в последний раз, и ваш буфер kill будет расширяться, насколько это возможно, до следующего из них - или новой строки (или возврата, если icrnl устанавливается, а igncr нет) - встречается во входных данных.
Одно из решений — вставить его в редактор, который поддерживает длинные строки, например, в vim.
Если вы используете vim, сначала войдите в режим вставки -с помощью:paste
↵ , прежде чем войти в режим вставки -с помощью i и вставить текст.