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

У меня была аналогичная проблема:

dpkg: dependency problems prevent removal of libefl:
 evas-loaders depends on libefl.

dpkg: error processing package libefl (--remove):
 dependency problems - not removing
Errors were encountered while processing:
 libefl

Отключение PPA просвещения исправило ее для меня.

0
24.07.2016, 15:24
3 ответа

Я думаю, что то, что вы пытаетесь выполнить, очень сложно, если не невозможно, даже когда вы можете создать функцию-оболочку, чтобы делать то, что вы хотите, и псевдоним для вызова оболочки вместо реальной команды, все идет не так, потому что обычно вы запустите sudo pacman -S и sudo разбивает все функции и псевдонимы, переключая контексты.

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

Чтобы создать файл:

pacman -Qe | cut -d ' ' -f 1 | tr "\n" " " >the-file.txt
  • pacman -Qe : перечисляет все явно установленные пакеты.
  • cut -d '' -f 1 : удалить версии пакета и оставить только имена.
  • tr "\ n" "" : заменить символы новой строки на пробелы.
  • > the-file.txt : предназначен для перенаправления вывода в файл, не стесняйтесь изменять имя файла и путь по своему усмотрению.

Это выведет список, разделенный пробелами, в файл-file.txt, затем вы передадите файл на целевую машину и запустите:

sudo pacman -Sy - <the-file.txt

Вуаля, pacman устанавливает все пакеты из списка, и вы получите тот же результат.

Вы также можете добавить аргумент - необходимый в pacman, чтобы он не переустанавливал обновленные пакеты pacman -S --needed ... .

И если вы делаете новую машину удаленно, вы можете пропустить передачу файла и просто передать результаты по ssh, и они будут перенесены на удаленную машину:

pacman -Qe | cut -d ' ' -f 1 | tr "\n" " " | ssh -t user@host "sudo pacman -S --needed -"
  • С -t ssh выделяет псевдотерминал, иначе sudo не сработает.

Удачи.

3
29.04.2021, 00:12

Есть посмотрите на sudosh2 , где вы сможете записывать всю историю ваших команд с воспроизведением. Это может делать то, что вы хотите.

-1
29.04.2021, 00:12

Если вы используете bash:

trap `echo $BASH_COMMAND | fgrep "pacman - S" >> /home/logfile

Вам также понадобится это в вашем .bash_profile или подобном, чтобы оно запускалось для каждой интерактивной оболочки.

Разумеется, это фиксирует только то, что вы набрали в bash, а не то, что было выполнено каким-то другим способом, например, внешним, выполняющим pacman в фоновом режиме.

Имейте в виду, что это может сильно снизить производительность (выполнение fgrep для каждой другой выполняемой команды), поэтому, хотя это и отвечает на ваш вопрос, это не обязательно лучший способ достижения вашей цели - отслеживания пакетов.

См. также: https://superuser.com/q/175799

Если вы используете zsh, поищите функцию preexec в руководстве zsh.

0
29.04.2021, 00:12

Теги

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