Как перечитать по входу 4k без новых строк на терминале?

Вы пробовали baobab или filelight ?

25
21.05.2014, 01:57
5 ответов
[1173109]Если я правильно понимаю исходник, то под Linux максимальное количество символов, которое может быть прочитано за один проход на терминале, определяется в исходнике ядра

N_TTY_BUF_SIZE

. Значение [1173517] [1173518] равно 4096.

Это ограничение терминального интерфейса, а именно [1173519] канонический ("cooked") режим [1173520], который обеспечивает чрезвычайно грубый строчный редактор (обратное пространство, ввод, [1173521]Ctrl[1173522]+[1173523]D[1173524] в начале строки для конца файла). Это происходит полностью вне процесса чтения.

Вы можете переключить терминал в режим raw, который отключает обработку строк. Также он отключает [1173525]Ctrl[1173526]+[1173527]D[1173528] и другие приятные моменты, что ложится дополнительным бременем на вашу программу.

Это древнее ограничение Unix, которое никогда не исправлялось, т.к. мотивации было мало. Люди не заходят в такие длинные очереди. Если бы вы подавали входные данные программы, вы бы перенаправляли входные данные вашей программы из файла или трубы.

Например, чтобы использовать содержимое буфера обмена 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] хорошо подходит для этого: он преобразует произвольные данные в символы для печати и игнорирует пробелы при декодировании. Дополнительным преимуществом такого подхода является поддержка произвольных данных на входе, даже управляющих символов, которые терминал будет интерпретировать при вставке. В вашем случае вы можете кодировать содержимое:

затем декодировать:

23
27.01.2020, 19:40
[1172385] Предел, с которым вы сталкиваетесь, - это максимальный размер строки в режиме [1172739] канонического ввода [1172740], [1172741]MAX_CANON[1172742].
  • В режиме канонического ввода драйвер tty предоставляет базовые услуги редактирования строки, так что пользовательской программе это не нужно. Он не имеет почти столько функций, как чтение строки, но распознает несколько настраиваемых специальных символов, таких как стирание (обычно Backspace или Delete) и убийство (обычно Ctrl-U).
  • Самое важное для вашего вопроса, канонический режим ввода буферов до тех пор, пока не будет виден символ конца строки. Так как буфер находится в драйвере tty, в памяти ядра он не очень большой.
  • Вы можете отключить канонический режим с помощью [1172743]stty cbreak[1172744] или [1172745]stty -icanon[1172746], а затем выполнить вставку. Это имеет существенный недостаток, который заключается в том, что вы не сможете отправить EOF с Ctrl-D. Это еще одна вещь, за которую отвечает канонический режим. Вы все равно сможете прервать работу [1172747]cat[1172748] с помощью Ctrl-C, потому что генерирующие сигнал символы управляются отдельным флагом ([1172749]stty raw[1172750] или [1172751]stty -isig[1172752]).

    Для меня загадка в том, почему, поскольку вы уже продемонстрировали, что знаете о [1172753]xclip[1172754], вы не просто используете [1172755]xclip -o > file[1172756] вместо [1172757]cat

    14
    27.01.2020, 19:40

    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].

    1
    27.01.2020, 19:40

    Если вы выполните:

    stty eol =
    

    А затем запустите демонстрацию, предложенную в вашем EDIT , вы увидите foo bar в распечатке test.out . Линейная дисциплина терминала будет сбрасывать свой вывод читателю, когда он читает каждый специальный eol char в вашем вводе.

    Терминал Linux с каноническим режимом, который можно настроить с помощью stty icanon или, возможно, просто stty sane - обрабатывает следующие специальные входные символы ...

    • eof {{ 1}}
      • по умолчанию: ^ D
      • Завершает строку ввода и сбрасывает вывод в устройство чтения. Поскольку он удаляется из ввода, если он вводится как единственный символ в строке, он передается считывающему устройству как null чтение - или конец файла .
    • eol
      • default: unsassigned
      • Также завершает строку ввода, но не удаляется из ввода.
    • kill
      • по умолчанию: ^ U
      • Удаляет весь буферизованный ввод.
    • удалить
      • по умолчанию: ^ H (или, возможно, @ или ^? в некоторых системах)
      • Удаляет последний буферизованный входной символ.

    Когда также установлено iexten - например, stty icanon iexten или, опять же, вероятно, просто stty sane , канонический терминал Linux также будет обрабатывать ...

    • eol2
      • default: unassigned
      • Также также завершает строку ввода, и также не удаляется из ввода.
    • werase
      • по умолчанию: ^ W
      • Удаляет последнее буферизованное входное слово .
    • rprnt
      • по умолчанию: ^ R
      • Перепечатывает весь буферизованный ввод.
    • lnext
      • по умолчанию: ^ V
      • Удаляет любое особое значение, касающееся дисциплины линии, для непосредственно следующего за входным символом.

    Эти символы обрабатываются путем их удаления из входного потока - за исключением eol и eol2 , то есть - и выполнения соответствующей специальной функции перед передачей обработанного потока в считыватель - которая обычно является вашей оболочкой, но может быть любой группой процессов переднего плана.

    Другие специальные входные символы, которые обрабатываются аналогичным образом, но могут быть настроены независимо от любого параметра icanon , включают набор isig - набор, например stty isig и, вероятно, также включен в разумную конфигурацию:

    • выйти
      • по умолчанию: ^ \
      • Очищает весь буферизованный ввод (если noflsh не установлен) и отправляет SIGQUIT группе процессов переднего плана - вероятно, генерируя дамп ядра.
    • susp
      • по умолчанию: ^ Z
      • Очищает весь буферизованный ввод (если noflsh не установлен) и отправляет SIGTSTP на группа процессов на переднем плане. Приостановленная группа процессов может быть возобновлена ​​с помощью kill -CONT "$!" или просто fg в ( set -m ) Снаряд с управляемым заданием.
    • intr
      • по умолчанию: ^ C
      • Очищает весь буферизованный ввод (если noflsh не установлен) и отправляет SIGINT на группа процессов на переднем плане.

    И набор ixon - настроен как stty ixon , а также обычно включается в нормальную конфигурацию:

    • стоп
      • по умолчанию: ^ S
      • Останавливает весь вывод в считыватель до тех пор, пока либо start не будет прочитано во входных данных, либо - если также задано ixany - еще не менее одного символа читать.
    • start
      • по умолчанию: ^ Q
      • Перезапускает вывод, если он ранее был остановлен с помощью stop .
    • Оба параметра stop и start удаляются из ввода при обработке, но если вывод перезапускается из-за любого символа на входе, когда установлено ixany , то это персонаж не удаляется.

    Специальные символы, обрабатываемые в других системах, отличных от Linux, могут включать ...

    • flush
      • по умолчанию: ^ O
      • Включает сброс и сброс буферизованного ввода и удаляется от ввода.
    • dsusp
      • по умолчанию: unassigned
      • Очищает весь буферизованный ввод только тогда, когда средство чтения читает назначенный специальный входной символ, а затем отправляет SIGTSTP.

    И, возможно ...

    • swtch
      • default ^ @ (что означает \ 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 нет) - встречается во входных данных.

    3
    27.01.2020, 19:40

    Одно из решений — вставить его в редактор, который поддерживает длинные строки, например, в vim.

    Если вы используете vim, сначала войдите в режим вставки -с помощью:paste, прежде чем войти в режим вставки -с помощью i и вставить текст.

    0
    27.01.2020, 19:40

    Теги

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