web-dev-qa-db-ja.com

一重引用符をエスケープしてエイリアスを正しく作成する方法

私のプロセスが消費するメモリの量を知るために、この一行が与えられました。

$ ps -u $USER -o pid,rss,command | \
    awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'

次に、そのコマンドのエイリアスを作成したいのですが、エスケープの問題'文字:

$ alias mm=ps -u $USER -o pid,rss,command | \
    awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'
bash: alias: -u: not found
bash: alias: myuser: not found
bash: alias: -o: not found
bash: alias: pid,rss,command: not found
Total 0 MB

一重引用符をエスケープしようとしましたが、それでも機能しません。

$ alias mm='ps -u $USER -o pid,rss,command | \
    awk \'{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}\''
> 

このエイリアスの作成方法を教えてください。

7
Paolo

これをエイリアスにするには(可能な場合)、エイリアスの値全体を二重引用符で囲む必要があります。結果として、エイリアス内のいくつかのものをエスケープする必要もあり、awkへのフィールド引数のいずれかをエスケープする必要があります。これらは、設定しているときにBashによっても引数として解釈されるためです。エイリアス。

これは私のために働きました:

$ alias mm="ps -u $USER -o pid,rss,command | \
    awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}'"

上記で私は次のことを行いました:

  1. エイリアスの値を二重引用符で囲みます

    alias mm="ps -u ...."
    
  2. エスケープされたawkの二重引用符

    awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}
    
  3. エスケープされたawkのフィールド

    awk '{print \$0}{sum+=\$2} END
    

これを使用しますか?

おそらくそうではありません。代わりに、これをBash関数に切り替えます。何が起こっているのかを維持して理解するのが簡単になるからですが、それでも必要な場合は、ここにエイリアスがあります。

9
slm

このエイリアスの作成方法を教えてください。

Bashを使用して.bashrcに配置する場合は、関数を作成することをお勧めしますか?

mm() {
  ps -u "$USER" -o pid,rss,command |
    awk '{print $0}{sum+=$2}
         END {print "Total", sum/1024, "MB"}'
}

bashの場合、変数を引用符で囲む必要があります。関数では、すべてを1行に記述する必要はありません。

10
user17530

ここにエスケープされたコマンドがあります:

alias mm='ps -u $USER -o pid,rss,command | \
    awk '\''{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'\'

シェルで引用符をエスケープする例:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

これは、すでに開いているものを終了することによって単純に行われます(')、エスケープされたもの(\')、次に別のものを開きます(')。

または:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

既に開いているものを終了することで行われます(')、引用符を別の引用符("'")、次に別のものを開きます(')。

関連: 単一引用符で囲まれた文字列内の単一引用符をエスケープする方法? stackoverflow SEで

3
kenorb