대화형 쉘 스크립트의 출력 파이핑

대화형 쉘 스크립트의 출력 파이핑

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)

여태까지는 그런대로 잘됐다. 하지만 저는 또한 다음과 같은 도구를 사용합니다.yaypacman는 기본적으로 에 패키지를 관리하는 기능이 추가된 래퍼 입니다.아치 사용자 저장소(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                                                              
[...]

통일성을 위해 검색 결과 수정 사항을 이 함수에도 적용하려고 했지만 상호 작용성 및 줄 바꿈이 없는 줄( ==>)이 있다는 사실로 인해 몇 가지 다른 접근 방식이 필요합니다.

검색 결과 부분만 변경한 다음 나머지 스크립트를 직접 통과해야 합니다.

paste나는 / 와 비슷 column하지만 킬 스위치가 있는 작은 Perl 스크립트를 작성했습니다.

#!/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내가 그랬어. 하지만 여전히 궁금합니다. 이와 같은 대화형 프로그램의 출력을 변경하는 간단한 방법이 있습니까?

관련 정보