"print -c"가 실패하지만 "column"에 대한 파이핑이 열을 성공적으로 인쇄하는 이유는 무엇입니까?

"print -c"가 실패하지만 "column"에 대한 파이핑이 열을 성공적으로 인쇄하는 이유는 무엇입니까?

이것은 작동합니다:

#!/bin/zsh

### List apps ###

arch="$(paru --query --quiet --explicit --unrequired)"
repos=( $HOME/repos/./* )
npm=( $(npm list --global --parseable) )
box="${(l:20::─:)}"

print -l "${arch}" "${box}" "${repos[@]:t}" "${box}" "${npm[@]:1:t}" | column

결과:

alsa-utils                    foot                          libva-utils                   patch                         waylock
android-tools                 fuzzel                        links                         pdfarranger                   wine-gecko
anki                          fwupd                         linux-lts                     pinta                         winetricks
aria2                         fzy                           linux-zen                     pkgconf                       wl-color-picker
auto-cpufreq                  github-cli                    lswt                          pkgstats                      wlsunset
autoconf                      gnu-netcat                    make                          polkit-gnome                  xdg-user-dirs
automake                      go                            man-db                        pulsemixer                    xorg-xeyes
base                          gocryptfs                     mdcat                         python-android-backup-tools   zip
bison                         grabc                         meld                          qutebrowser                   zram-generator
brightnessctl                 greetd                        microsoft-edge-stable-bin     ripgrep                       zsh-completions
calibre                       greetd-tuigreet               moreutils                     river                         ────────────────────
cheat                         grive                         mupdf                         rivercarro                    ansiweather
cmus                          helix                         ncdu                          rustup                        bash-script-template
cups-pdf                      httrack                       neomutt                       speedtest-cli                 cheatsheets
dragon-drop                   imv                           newsboat                      swayidle                      paru
dunst                         intel-gpu-tools               nicotine+                     system-config-printer         typewritten
edk2-shell                    intel-ucode                   noto-fonts-cjk                tealdeer                      zsh-z
efibootmgr                    inxi                          noto-fonts-emoji              timeshift                     ────────────────────
eg                            iwd                           onedrive-abraunegg            tiny-irc-client               vercel
fd                            jpegoptim                     pacman-contrib                ufw
flex                          jq                            pandoc-bin                    urlview
foliate                       kakoune                       paru                          vscode-langservers-extracted

print -c그러나 파이프 대신 실행할 마지막 줄을 변경하면 column세로로 인쇄되지 않습니다.

print -c "${arch}" "${box}" "${repos[@]:t}" "${box}" "${npm[@]:1:t}"

답변1

변수 $arch는 개행 문자가 포함된 매우 긴 문자열을 포함하는 스칼라 변수로 정의됩니다.

해당 문자열의 각 행을 별도의 인수로 전달하여 print -c열 단위로 인쇄할 수 있으므로 $arch각 행이 별도의 요소로 포함된 배열이 됩니다.

일부(비어 있지 않은) 출력 라인을 얻는 것은 eed 문자 라인에서 매개변수 확장 플래그를 분할하여 수행됩니다 ${(f)"$(cmd)"}.zshff

#! /bin/zsh -

 arch=( ${(f)"$(paru --query --quiet --explicit --unrequired)"} )
repos=( ~/repos/*(N:t) )
  npm=( ${${(f)"$(npm list --global --parseable)"}:t} )
  sep=${(l[20][─])}

print -rc -- $arch $sep $repos $sep $npm[2,-1]

목록을 별도의 열에 인쇄하려면 구분 기호를 사용할 필요가 없습니다.

paste <(print -rC1 -- $arch) \
      <(print -rC1 -- $repos) \
      <(print -rC1 -- $npm[2,-1]) |
  expand -t 20

예:

$ paste <(seq 10) <(seq 12) <(seq 3) | expand -t20
1                   1                   1
2                   2                   2
3                   3                   3
4                   4
5                   5
6                   6
7                   7
8                   8
9                   9
10                  10
                    11
                    12

기타 참고사항:

  • 스크립트의 한정자를 참고하세요 N. 숨겨지지 않은 파일이 없으면 스크립트가 중단되지 않습니다.~/repos
  • 일반적으로 사용하고 싶지 않은 백슬래시 처리 형식을 수행 하거나 인쇄하려는 항목에서 옵션을 분리하는 대신 이를 사용할 때마다 이를 기본값으로 print사용해야 합니다 . 후자를 수행하지 못하면 명령 주입 취약점이 발생할 수 있습니다.-r---
  • /./내가 아는 한, 귀하의 코드에 있는 코드는 아무 작업도 수행하지 않으며 이를 제거했습니다. 숨겨진 파일을 포함하려면 Dglob 한정자를 추가해야 합니다.
  • lib첫 번째 항목이라고 가정하지 않고 제외 하려면 대신 $npm사용할 수 있습니다 (저는 최근에 추가되었으며 ksh93/bash와의 호환성을 위해서만 추가된 zsh를 선호합니다).${num:#lib}$num[2,-1]${num:1}
  • print -rC1 --print -rl --인수가 없으면 빈 줄만 인쇄하므로 한 줄에 요소가 하나씩 있는 목록을 인쇄하는 더 정식적인 방법이므로 print -lolumn에 인쇄하는 것 보다 낫습니다.1 C

관련 정보