为什么“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而不假设它是第一个,你可以使用${num:#lib}而不是$num[2,-1](我更喜欢${num:1}最近才添加的 zsh 并且只是为了与 ksh93/bash 兼容)。
  • print -rC1 --print -rl --(更不用说print -l)在 olumn 上打印更好1 C,因为在没有给出参数的情况下,它不打印任何内容而不是空行,因此是打印列表的更规范的方式,每行一个元素。

相关内容