改行、カンマ、および引用符を含む 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 }'

ところで、以前に使用した単純なコマンドのようにエイリアスにどのように入れますか?

すべてを1行に入れるだけでは機能しません。引用符をエスケープしようとしましたが、単一引用符の代わりに二重引用符を使用すると解析エラーが発生しました。私はそれを関数としてパッケージ化しようとしましたが、awkコマンドは改行に依存しているようで、すべてのコマンドを1行に含めるのが好きではありません。

答え1

3 つの方法でこの問題を解決できます。

1:1つの機能のみを使用してください。エイリアスは単純なテキストマクロのためのものですが、2番目の例はそうではありません。

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

3番目: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 }'
}

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

動作します。

関連情報