Менеджер пакетов Arch Linux,pacman
, выводит результаты поиска, каждый из которых занимает две строки:
~ % pacman -Ss cowsay
extra/cowsay 3.04-2
Configurable talking cow (and a few other creatures)
community/ponysay 3.0.3-4
cowsay reimplemention for ponies
Есть способы grep этого вывода ( grep -C 1
и т. д.), но я предпочитаю обернуть вызов и передать вывод через paste - - | column -s $'\t' -t
. Это оставляет каждый результат поиска на отдельной строке:
~ % pacman -Ss cowsay
community/ponysay 3.0.3-4 (1.3 MiB 10.7 MiB) cowsay reimplemention for ponies
extra/cowsay 3.04-2 (19.5 KiB 38.2 KiB) Configurable talking cow (and a few other creatures)
Пока все хорошо. Но я также использую инструмент под названиемyay
, который по сути является оберткой вокруг pacman
, с дополнительной функциональностью для управления пакетами вРепозиторий пользователей Arch(AUR). yay
включает в себя интерактивную команду поиска/установки, которая активируется простой передачей поискового запроса без каких-либо других параметров:
~ % yay cowsay
15 aur/ponysay-free 3.0.2-1 (+1 0.00)
Awesome cowsay reimplemention with ponies for ponies. Only free ponies edition
[...]
4 aur/xcowsay 1.5.1-1 (+17 0.38)
a program based on cowsay that displays a cute cow and message on your desktop
3 aur/muccadoro 1.0.1-1 (+1 0.79)
Pomodoro timer using figlet, cowsay, and optionally lolcat
2 community/ponysay 3.0.3-4 (1.3 MiB 10.7 MiB)
cowsay reimplemention for ponies
1 extra/cowsay 3.04-2 (19.5 KiB 38.2 KiB)
Configurable talking cow (and a few other creatures)
==> Packages to install (eg: 1 2 3, 1-3 or ^4)
==> 1
resolving dependencies...
looking for conflicting packages...
Package (1) New Version Net Change Download Size
extra/cowsay 3.04-2 0.04 MiB 0.02 MiB
Total Download Size: 0.02 MiB
Total Installed Size: 0.04 MiB
:: Proceed with installation? [Y/n] Y
:: Retrieving packages...
cowsay-3.04-2-any 19.5 KiB 49.5 KiB/s 00:00 [#######################################################] 100%
(1/1) checking keys in keyring [#######################################################] 100%
(1/1) checking package integrity
[...]
Ради единообразия я надеялся применить свое исправление результатов поиска и к этой функции, но интерактивность и тот факт, что есть строки без переносов ( ==>
), требуют некоторых других подходов.
Мне нужно изменить только часть результатов поиска, а затем напрямую пройтись по остальной части скрипта.
Я написал небольшой скрипт на Perl, который чем-то похож на мой paste
/ column
, но с переключателем kill:
#!/usr/bin/perl
$thru = 0;
while (<>) {
if ( $thru == 1 || m/Packages to install / ) {
$thru = 1;
} else {
chomp unless (m/^ /);
s/^\s+/\t/;
}
print;
}
Но когда я передаю вывод через него, я теряю индикаторы выполнения и текст перед подсказками.
Вот разница:
--- correctnot.txt 2021-10-29 15:09:43.645632751 -0500
+++ correct.txt 2021-10-29 15:09:43.655632810 -0500
@@ -1,22 +1,22 @@
==> Packages to install (eg: 1 2 3, 1-3 or ^4)
-1
-==> resolving dependencies...
+==> 1
+resolving dependencies...
looking for conflicting packages...
-:: Proceed with installation? [Y/n]
+
Package (1) New Version Net Change
extra/cowsay 3.04-2 0.04 MiB
Total Installed Size: 0.04 MiB
-Y
-checking keyring...
-checking package integrity...
-loading package files...
-checking for file conflicts...
-checking available disk space...
+:: Proceed with installation? [Y/n] Y
+(1/1) checking keys in keyring [#######################################################] 100%
+(1/1) checking package integrity [#######################################################] 100%
+(1/1) loading package files [#######################################################] 100%
+(1/1) checking for file conflicts [#######################################################] 100%
+(1/1) checking available disk space [#######################################################] 100%
:: Processing package changes...
-installing cowsay...
+(1/1) installing cowsay [#######################################################] 100%
:: Running post-transaction hooks...
(1/3) Arming ConditionNeedsUpdate...
(2/3) Refreshing PackageKit...
В другой попытке я воссоздал все до первого запроса, а затем передал ответ на второй вызов:
echo q |
/usr/bin/yay "$@" |
perl -pe 'if ( m/Packages to install / ) { print; s/Packages to install.*//; chomp; print; exit; } chomp unless (m/^ /); s/^\s+/\t/'
read answer
echo "$answer" | exec /usr/bin/yay "$@"
Выход:
15 aur/ponysay-free 3.0.2-1 (+1 0.00) Awesome cowsay reimplemention with ponies for ponies. Only free ponies edition
[...]
4 aur/xcowsay 1.5.1-1 (+17 0.38) a program based on cowsay that displays a cute cow and message on your desktop
3 aur/muccadoro 1.0.1-1 (+1 0.79) Pomodoro timer using figlet, cowsay, and optionally lolcat
2 community/ponysay 3.0.3-4 (1.3 MiB 10.7 MiB) cowsay reimplemention for ponies
1 extra/cowsay 3.04-2 (19.5 KiB 38.2 KiB) Configurable talking cow (and a few other creatures)
==> Packages to install (eg: 1 2 3, 1-3 or ^4)
==> 1
15 aur/ponysay-free 3.0.2-1 (+1 0.00)
Awesome cowsay reimplemention with ponies for ponies. Only free ponies edition
[...]
4 aur/xcowsay 1.5.1-1 (+17 0.38)
a program based on cowsay that displays a cute cow and message on your desktop
3 aur/muccadoro 1.0.1-1 (+1 0.79)
Pomodoro timer using figlet, cowsay, and optionally lolcat
2 community/ponysay 3.0.3-4 (1.3 MiB 10.7 MiB)
cowsay reimplemention for ponies
1 extra/cowsay 3.04-2 (19.5 KiB 38.2 KiB)
Configurable talking cow (and a few other creatures)
==> Packages to install (eg: 1 2 3, 1-3 or ^4)
==> resolving dependencies...
looking for conflicting packages...
Package (1) New Version Net Change
extra/cowsay 3.04-2 0.04 MiB
Total Installed Size: 0.04 MiB
:: Proceed with installation? [Y/n] -> exit status 1
Начинается хорошо, но результаты выводятся дважды, и мне пришлось дважды запускать команду. Не пошло.
Примечание: Я, вероятно, должен упомянуть, что окупаемость инвестиций здесь очень низкая. Зачем мне вообще нужно grep интерактивного списка? На этом этапе я мог бы просто сделать форк yay
и удалить \n
из своей копии (я сделал. Но мне все равно интересно, есть ли простой способ изменить вывод такой интерактивной программы?