「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 --引数がない場合は空の行だけを印刷するので、1行に要素が1つずつあるリストを印刷するより正式な方法なので、print -lolumnに印刷するよりも優れています。1 C

おすすめ記事