AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 725611
Accepted
Pound Hash
Pound Hash
Asked: 2022-11-20 22:14:34 +0800 CST2022-11-20 22:14:34 +0800 CST 2022-11-20 22:14:34 +0800 CST

Por que `print -c` falha, mas o pipe para `column` é bem-sucedido para imprimir colunas?

  • 772

Isso funciona:

#!/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

Resultados:

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

Mas mudar a última linha para executar print -cem vez de canalizar columnnão funciona; imprime verticalmente:

print -c "${arch}" "${box}" "${repos[@]:t}" "${box}" "${npm[@]:1:t}"
zsh
  • 1 1 respostas
  • 68 Views

1 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2022-11-21T01:33:46+08:002022-11-21T01:33:46+08:00

    Sua $archvariável é definida como uma variável escalar que contém uma string muito longa com caracteres de nova linha.

    Você deseja que cada linha nessa string seja passada como argumentos separados para print -cpoder imprimi-los em colunas, para $archser uma matriz com cada linha como um elemento separado.

    Obter as linhas (não vazias) de alguma saída é ${(f)"$(cmd)"}onde zsho fsinalizador de expansão de parâmetro se divide em fcaracteres de linha:

    #! /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]
    

    Se você quiser imprimir as listas cada uma em sua própria coluna, eliminando a necessidade de um separador:

    paste <(print -rC1 -- $arch) \
          <(print -rC1 -- $repos) \
          <(print -rC1 -- $npm[2,-1]) |
      expand -t 20
    

    Exemplo:

    $ 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
    

    Outras notas:

    • observe o Nqualificador para o script não abortar se não houver nenhum arquivo não oculto em~/repos
    • quase sempre que você usar print, você deve usar a -ropção como padrão sem fazer alguma forma de processamento de barra invertida que você geralmente não deseja e usar -ou --para separar opções de coisas para imprimir. Não fazer o último pode introduzir vulnerabilidades de injeção de comando.
    • o /./em seu código não serve para nada, tanto quanto posso ver, e eu o removi. Se você quiser incluir arquivos ocultos, adicione o Dqualificador glob.
    • se você quisesse excluir libde $npmsem ter que assumir que é o primeiro, você usaria ${num:#lib}em vez de $num[2,-1](o que eu prefiro muito mais ao ${num:1}qual zsh adicionado recentemente e apenas para compatibilidade com ksh93/bash).
    • print -rC1 --é melhor do que print -rl --(e a fortiori do que print -l) imprimir em 1 Column, pois não imprime nada em vez de uma linha vazia quando não é fornecido nenhum argumento, portanto, é uma maneira mais canônica de imprimir uma lista, um elemento por linha.
    • 1

relate perguntas

  • Listar arquivos que não possuem outro arquivo com sufixo

  • Em que circunstâncias o executável encontrado primeiro no caminho não será usado

  • Symlinking para todos os arquivos de ponto e diretórios

  • Como incrementar uma variável nomeada dinamicamente em `zsh`

  • Por que não consigo definir uma variável somente leitura chamada path no zsh?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve