首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么‘打印-c`失败,但管道到’列‘成功打印列?

为什么‘打印-c`失败,但管道到’列‘成功打印列?
EN

Unix & Linux用户
提问于 2022-11-20 06:14:34
回答 1查看 78关注 0票数 1

这样做是可行的:

代码语言:javascript
复制
#!/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

结果:

代码语言:javascript
复制
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是行不通的;它垂直打印:

代码语言:javascript
复制
print -c "${arch}" "${box}" "${repos[@]:t}" "${box}" "${npm[@]:1:t}"
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-11-20 09:33:46

您的$arch变量被定义为一个标量变量,其中包含一个包含换行符的非常长的字符串。

您希望将该字符串中的每一行作为单独的参数传递给print -c,以便它能够在列中打印它们,因此$arch是一个数组,每一行都作为单独的元素。

获得某些输出的(非空)行的${(f)"$(cmd)"}zsh中使用,其中f参数展开标志在feed字符上拆分:

代码语言:javascript
复制
#! /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]

如果要在各自的列中打印每个列表,请删除对分隔符的需要:

代码语言:javascript
复制
paste <(print -rC1 -- $arch) \
      <(print -rC1 -- $repos) \
      <(print -rC1 -- $npm[2,-1]) |
  expand -t 20

示例:

代码语言:javascript
复制
$ 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] (我更喜欢使用D29而不是最近添加的zsh,并且只为了与zsh 93/bash兼容)。
  • print -rC1 --print -rl -- (甚至比print -l)更适合在1 Column上打印,因为在没有给定参数的情况下,它只打印空行,这是打印列表(每行一个元素)的一种更规范的方法。
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/725611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档