개행, 쉼표 및 따옴표가 포함된 zsh 별칭

개행, 쉼표 및 따옴표가 포함된 zsh 별칭

내 zshrc에는 다음과 같은 별칭이 있습니다.

alias sl='screen -list'

필요한 작업을 수행하지만(실행 중인 화면 보기) 출력이 다소 보기 흉합니다.

[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.

그래서 포맷을 시작했고 다음과 같은 결과를 얻었습니다.

 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 }'

그런데 이전에 사용했던 간단한 명령처럼 별칭에 어떻게 넣나요?

모든 것을 한 줄에 넣는 것만으로는 작동하지 않습니다. 따옴표를 이스케이프 처리하려고 시도했는데 작은 따옴표 대신 큰 따옴표를 사용하면 구문 분석 오류가 발생했습니다. 나는 또한 그것을 함수로 포장하려고 시도했지만 awk 명령은 줄 바꿈에 의존하는 것 같고 모든 명령을 한 줄에 포함하는 것을 좋아하지 않습니다.

답변1

세 가지 방법으로 이 문제를 해결할 수 있습니다.

하나: 하나의 기능만 사용합니다. 별칭은 간단한 텍스트 매크로를 위한 것이지만 두 번째 예는 그렇지 않습니다.

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 }'
}

2: quote-line위젯을 사용하여 전체 명령을 올바르게 이스케이프하세요.

# 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 }'\'''

셋째: 한 가지 기능만 사용하세요. 별칭은 간단한 텍스트 매크로에 사용됩니다.

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 }'
}

awk 예제도 개행 문자에 의존하지 않지만 ;같은 줄에서 여러 문을 구분해야 합니다.

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 }'

작동합니다.

관련 정보