Существует множество доступных инструментов, которые делают то же самое, что openvt
делает :открывает новый псевдо-терминал -и запускает назначенную команду со стандартным вводом-выводом, подключенным к этому псевдо-терминалу -..
ptyrun
иptybandage
ptyrun
и ptybandage
на утилитах набора инструментов nosh zpty
в оболочке Z % tty ; ptybandage tty /dev/pts/5 /dev/pts/6 %
Конечно, разница заключается в том, что в случае псевдотерминалов -необходимо, чтобы какой-то процесс был присоединен к главной стороне псевдотерминала -, чтобы фактически сделать что-то с ввод/вывод. В случае инструментов Бернштейна это программа ptyio
. ptyrun
и ptybandage
на самом деле являются сценариями, которые переходят в программы ptyget
, ptyio
и ptyspawn
. Аналогичная ситуация с моими инструментами, где программа pty-run
является внутренней рабочей лошадкой ввода-вывода в сочетании с pty-get-tty
и open-controlling-tty
.
Это означает, что если кто-то хочет более мелкой -детализированной операции, просто открывая главную сторону псевдо--терминала, а затем последовательно загружая что-то , чтобы сделать все остальное, можно вызвать pty-get-tty
или ptyget
напрямую.
В случае терминальных мультиплексоров tmux
и screen
, конечно, существуют механизмы (, которые являются частью этих программ )для запуска нового (внутреннего )терминала и запуска прикрепленная к нему команда. Подробнее см. документацию по этим программам.
Какие инструменты (ptyrun
, ptybandage
и др. )делать не делать это запускать команды, присоединяя их к существующим псевдо-терминалам -. Они всегда создают свежие.
Существует небольшая потребность в выполнении команд, подключенных к существующим псевдо-терминалам -. Но это может быть сделано. Например, это можно сделать с помощью моего набора инструментов.Просто установите переменную окружения TTY
на имя файла устройства подчиненной стороны существующего псевдо-терминала -и вызовите команду с помощью инструмента open-controlling-tty
.
TTY=/dev/pts/5 open-controlling-tty $SHELL
Это, конечно, создает конкуренцию за терминал среди различных несвязанных параллельных процессов, и заставляет с болью осознать, как много оболочки управления заданиями делают для одного. & #9786;
Также обратите внимание, что некоторые SSH-серверы и эмуляторы терминалов закроют главную сторону, если их ведомая -дочерняя сторона завершится.
Наконец, обратите внимание, что это не механизмы заполнения ввода -, для управления существующей интерактивной оболочкой на существующем псевдо-терминале -, посылая команды на его вход. Все они присоединяют новых процессов к (новым )псевдо-терминалам -.
Но ведь openvt
это тоже не то.
ptyrun
. djbwares . ptybandage
. djbwares . ptyio
. djbwares . ptyget
. djbwares . ptyrun
. Направляющая ноша . Программное обеспечение. ptybandage
. Направляющая ноша . Программное обеспечение. pty-run
. Направляющая ноша . Программное обеспечение. pty-get-tty
. Направляющая ноша . Программное обеспечение. open-controlling-tty
. Направляющая ноша . Программное обеспечение.Для второго приложения/проблемы я бы использовал программу резервного копирования с дедупликацией, такую как restic
или borgbackup
, а не пытался вручную отслеживать «исправления» или различия. Программа резервного копирования restic
позволяет создавать резервные копии каталогов с нескольких машин в один и тот же репозиторий резервных копий, дедуплицируя данные резервного копирования как среди фрагментов файлов с отдельной машины, так и между машинами. (У меня нет опыта работы с borgbackup
, поэтому я ничего не могу сказать об этой программе.)
Вычисление и сохранение различий между файлами abc
и abc2
можно выполнить с помощью rsync
.
Это пример, когда abc
и abc2
составляют 153 МБ. Файл abc2
был изменен путем перезаписи первых 2,3 МБ файла некоторыми другими данными :
$ ls -lh
total 626208
-rw-r--r-- 1 kk wheel 153M Feb 3 16:55 abc
-rw-r--r-- 1 kk wheel 153M Feb 3 17:02 abc2
Создаем наш патч для преобразования abc
в abc2
и называем егоabc-diff
:
$ rsync --only-write-batch=abc-diff abc2 abc
$ ls -lh
total 631026
-rw-r--r-- 1 kk wheel 153M Feb 3 16:55 abc
-rw------- 1 kk wheel 2.3M Feb 3 17:03 abc-diff
-rwx------ 1 kk wheel 38B Feb 3 17:03 abc-diff.sh
-rw-r--r-- 1 kk wheel 153M Feb 3 17:02 abc2
Сгенерированный файл abc-diff
представляет собой фактический diff (ваш «файл исправления» ), а abc-diff.sh
представляет собой короткий сценарий оболочки, который rsync
создает для вас:
$ cat abc-diff.sh
rsync --read-batch=abc-diff ${1:-abc}
Этот сценарий модифицирует abc
, чтобы он стал идентичен abc2
, учитывая файлabc-diff
:
$ md5sum abc abc2
be00efe0a7a7d3b793e70e466cbc53c6 abc
3decbde2d3a87f3d954ccee9d60f249b abc2
$ sh abc-diff.sh
$ md5sum abc abc2
3decbde2d3a87f3d954ccee9d60f249b abc
3decbde2d3a87f3d954ccee9d60f249b abc2
Файл abc-diff
теперь можно перенести в другое место, которое у вас есть abc
. С помощью команды rsync --read-batch=abc-diff abc
вы примените патч к файлу abc
, преобразовав его содержимое так, чтобы оно совпадало с файлом abc2
в системе, где вы создали diff.
Re -применение патча во второй раз кажется безопасным.Сообщений об ошибках нет и содержимое файла не меняется (контрольная сумма MD5 не меняется ).
Обратите внимание, что если вы не создадите явный «обратный патч», нет возможности легко отменить применение патча.
Я также протестировал запись модификации 2,3 МБ в какое-то другое место в данных abc2
, немного дальше в (примерно на 50 МБ ), а также в начале. Сгенерированный «патч» имел размер 4,6 МБ, что позволяет предположить, что в патче были сохранены только измененные биты.
Пробовали ли вы просто заставить diff
обрабатывать файлы как текст:
diff -ua abc abc2
Как объяснено здесь .
-u
вывод ЧИСЛО (по умолчанию 3 )строки единого контекста -a
обрабатывать все файлы как текст Вы получите патч. Недостатком этого является то, что «линии» могут быть довольно длинными, и это может раздуть патч.
How to compute a binary diff of abc and abc2?
Использование bsdiff/bspatch или xdelta и других.
$ bsdiff older newer patch.bin # patch.bin is created
[...]
$ bspatch older newer patch.bin # newer is created
Тем не менее, следует принять к сведению эти предостережения из справочных страниц.:
bsdiff
использует память, в 17 раз превышающую размер oldfile , и требует абсолютного минимального размера рабочего набора, в 8 раз превышающего размер oldfile . bspatch
использует память, равную размеру oldfile плюс размер newfile , но может работать с очень маленьким рабочим набором без существенного потеря производительности. Дополнения к другим ответам согласно моим тестам:
diff
Я создал два очень похожих файла по 256 МБ abc
и abc2
. Затем создадим файл различий:
diff -ua abc abc2 > abc-abc2.diff
Теперь попробуем восстановить abc2
благодаря оригинальному файлу abc
иabc-abc2.diff
:
cp abc abc3
patch abc3 < abc-abc2.diff
или
cp abc abc3
patch abc3 -i abc-abc2.diff
или
patch abc -i abc-abc2.diff -o abc3
Работает в Linux. Я также пробовал в Windows (patch.exe и diff.exe также доступны ), но по неизвестной причине это не удалось :полученный abc3
файл имеет размер всего 1 КБ вместо 256 МБ (Я обновить этот ответ позже здесь ).
rsync
Как подробно описано в принятом ответе, это работает:
rsync --only-write-batch=abc-abc2-diff abc2 abc
cp abc abc3
rsync --read-batch=abc-abc2-diff abc3
rdiff
Как подробно описано в этом ответе , это тоже решение:
rdiff signature abc abc-signature
rdiff delta abc-signature abc2 abc-abc2-delta
rdiff patch abc abc-abc2-delta abc3
Также протестировано в Windows с помощью rdiff.exe из здесь , все работает.