zsh alias com linefeeds, vírgulas e citações

0

No meu zshrc, tenho um alias como este:

alias sl='screen -list'

Ele se ajusta à minha necessidade (ver quais telas tenho em execução), mas a saída é bastante feia:

[pts/7]~% sl
There are screens on:
        32765.quotes-api        (04/26/2015 11:09:18 AM)        (Detached)
        5055.gitsync-test       (04/07/2015 09:24:04 PM)        (Detached)
        15074.gitsync-interceptor       (03/31/2015 10:39:45 AM)        (Detached)
        4662.eloquent-api    (03/29/2015 11:37:26 AM)        (Detached)
        16177.Dropbox   (03/17/2015 03:53:44 PM)        (Detached)
        18803.gitsync-todo-api-py       (03/06/2015 08:21:24 AM)        (Detached)
        796.website (01/31/2015 01:56:02 PM)        (Detached)
        7874.gitsync-optionals  (01/29/2015 02:27:24 PM)        (Detached)
        28474.linkbag   (12/16/2014 09:56:39 AM)        (Detached)
        10839.datapump  (10/13/2014 02:16:26 PM)        (Detached)
        5118.resr-api-python        (09/13/2014 12:28:33 PM)        (Detached)
        7619.dataglobbing    (09/03/2014 08:34:13 PM)        (Detached)
        10583.rest-api-dataglobbing  (09/03/2014 01:06:21 AM)        (Detached)
        11705.save-functions    (08/12/2014 01:00:58 PM)        (Detached)
14 Sockets in /var/run/screen/S-tuvokki.

Então eu comecei a formatar isso e fiz o seguinte funcionar:

 screen -list|grep -v There|grep -v Sockets|awk 'BEGIN { format = " %-35s %-10s %s\n"
         printf format, "Name", "Active", "Status"
         printf format, "----", "------", "------" }
       { printf format, $1, $2, $5 }'

Mas como coloco isso em um alias como o comando simples que eu tinha antes?

Basta colocar tudo em uma linha não funciona. Eu tentei escapar as citações, use aspas duplas em vez de erros de análise deu único. Eu também tentei envolvê-lo em uma função, mas parece que o comando awk depende das novas linhas e não gosta de todas as instruções estarem em uma linha.

    
por tuvokki 07.05.2015 / 14:01

1 resposta

3

Existem três maneiras de resolver isso.

Um: é só usar uma função. os aliases são para macros de texto simples, algo que seu segundo exemplo não é.

sl() {
screen -list|grep -v There|grep -v Sockets|awk 'BEGIN { format = " %-35s %-10s %s\n"
         printf format, "Name", "Active", "Status"
         printf format, "----", "------", "------" }
       { printf format, $1, $2, $5 }'
}

Dois: use o widget quote-line para escapar corretamente do comando inteiro

# type the entire command out like you would interactively.
% screen -list|grep -v There|grep -v Sockets|awk 'BEGIN { format = " %-35s %-10s %s\n"
     printf format, "Name", "Active", "Status"
     printf format, "----", "------", "------" }
   { printf format, $1, $2, $5 }'
# use quote-line which transform the line into:
% 'screen -list|grep -v There|grep -v Sockets|awk '\''BEGIN { format = " %-35s %-10s %s\n"
     printf format, "Name", "Active", "Status"
     printf format, "----", "------", "------" }
   { printf format, $1, $2, $5 }'\'''
# prepend alias sl= to the newly escaped line:
% alias sl='screen -list|grep -v There|grep -v Sockets|awk '\''BEGIN { format = " %-35s %-10s %s\n"
     printf format, "Name", "Active", "Status"
     printf format, "----", "------", "------" }
   { printf format, $1, $2, $5 }'\'''

E três: use apenas uma função. os aliases são para macros de texto simples.

sl() {
screen -list|grep -v There|grep -v Sockets|awk 'BEGIN { format = " %-35s %-10s %s\n"
         printf format, "Name", "Active", "Status"
         printf format, "----", "------", "------" }
       { printf format, $1, $2, $5 }'
}

O exemplo de awk também não depende de novas linhas, mas você precisa de ; para separar várias instruções na mesma linha.

screen -list|grep -v There|grep -v Sockets|awk 'BEGIN { format = " %-35s %-10s %s
"; printf format, "Name", "Active", "Status"; printf format, "----", "------", "------" } { printf format, $1, $2, $5 }'

Vai funcionar.

    
por 07.05.2015 / 14:18