这有效:
#!/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)"}
下进行的:zsh
f
f
#! /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
选项作为默认选项,而不是进行某种形式的反斜杠处理,您通常不希望使用-
或--
将选项与要打印的内容分开。不执行后者可能会引入命令注入漏洞。 /./
据我所知,您的代码中的 没有任何作用,我已将其删除。如果您想包含隐藏文件,则需要添加D
glob 限定符。- 如果你想排除
lib
它$npm
而不假设它是第一个,你可以使用${num:#lib}
而不是$num[2,-1]
(我更喜欢${num:1}
最近才添加的 zsh 并且只是为了与 ksh93/bash 兼容)。 print -rC1 --
比print -rl --
(更不用说print -l
)在 olumn 上打印更好1
C
,因为在没有给出参数的情况下,它不打印任何内容而不是空行,因此是打印列表的更规范的方式,每行一个元素。