내 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 }'
작동합니다.