这有效:
#!/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
但是将最后一行更改为 runprint -c
而不是 pipe tocolumn
是行不通的;它垂直打印:
print -c "${arch}" "${box}" "${repos[@]:t}" "${box}" "${npm[@]:1:t}"
您的
$arch
变量被定义为一个标量变量,其中包含一个非常长的字符串,其中包含换行符。您希望该字符串中的每一行都作为单独的参数传递
print -c
给它,以便能够将它们打印在列中,因此$arch
成为一个数组,每行作为一个单独的元素。获取一些输出的(非空)行是
${(f)"$(cmd)"}
在参数扩展标志在换行字符上分割的zsh
地方:f
f
如果您想在各自的列中打印列表,则不需要分隔符:
例子:
其他注意事项:
N
限定符,如果没有非隐藏文件,则脚本不会中止~/repos
print
,你都应该使用这个-r
选项作为默认选项,而不是做一些你通常不想要和使用的反斜杠处理形式,-
或者--
将选项与要打印的东西分开。不做后者会引入命令注入漏洞。/./
代码中的 没有任何作用,我已将其删除。如果您想包含隐藏文件,您需要添加D
glob 限定符。lib
而$npm
不必假设它是第一个,你会使用${num:#lib}
而不是$num[2,-1]
(我更喜欢${num:1}
最近才添加的 which zsh,并且只是为了与 ksh93/bash 兼容)。print -rC1 --
优于print -rl --
(并且更胜于print -l
)在1
C
olumn 上打印,因为当没有给出任何参数时,它不打印任何内容而不是空行,因此这是一种更规范的打印列表的方式,每行一个元素。