エイリアスを使用するとコマンドが機能しないのはなぜですか?

エイリアスを使用するとコマンドが機能しないのはなぜですか?

ps -ef | grep catalina | grep -v grepシステムで実行されているTomcatプロセスを印刷するために使用します。

kshitiz   7099     1  0 May11 ?        00:02:29 /usr/lib/jvm/jdk1.8.0/bin/java -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:38156 -Dcatalina.base=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1 -Dcatalina.home=/opt/tomcat-7.0.42 -Dwtp.deploy=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps -Djava.endorsed.dirs=/opt/tomcat-7.0.42/endorsed -Dfile.encoding=UTF-8 -classpath /opt/tomcat-7.0.42/bin/bootstrap.jar:/opt/tomcat-7.0.42/bin/tomcat-juli.jar:/usr/lib/jvm/jdk1.8.0/lib/tools.jar org.apache.catalina.startup.Bootstrap start

次にそれを使用してps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'プロセスIDを抽出します。

7099

しかし、コマンド全体にエイリアスを追加してalias tomcat_id="ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'"エイリアスを使用すると、テキスト全体が印刷され、awk機能しないようです。

type tomcat_id以下を提供します。

tomcat_id is aliased to `ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }''

答え1

エイリアスの一般的な規則:エイリアスがエイリアスと比較して複雑すぎる場合は、代わりに関数を使用してください。

tomcat_id () {
  ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
}

エイリアス定義の問題は、誤って引用したことです。エイリアスを定義する行は、シェルによって解析されるシェルコマンドです。二重引用符を使用し、当時は位置引数がなかったので(したがって空の$2文字列に展開されます)、定義したエイリアスは次のようになります。

ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }'

エイリアスを定義する簡単な方法は、定義に一重引用符を使用し、aliasコマンドで一重引用符を使用しないことです。これを行うと、とにかくデフォルト値を削除しました-F " "(「空白」のように見えますが、「空白のシーケンス」を意味するので少し奇妙です)。

alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk "{print \$2}"'

あるいは、'\''単一引用符を使用して、単一引用符リテラル内で効果的に引用することもできます。

alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk '\''{print \$2}'\'

しかし、上記のように関数を使用する方がはるかに明確です。または、作業に適したツールを使用してください。

alias tomcat_id='pgrep catalina'

または

alias tomcat_id='pidof catalina'

答え2

Gnoucの答えは完全に有効ですが(だから私が投票しました)、代替案を提示したいと思います。

alias tomcat_id="ps -ef|awk '\$8 ~ /java/ && /catalina/ {print \$2}'"

ここでのアイデアは、プロセス名(フィールド8)内でを見つけることができなければならず、行java全体でを見つける必要があることですcatalina

だから我々はawkすべてのマッチングと印刷ジョブを完了しました。気にする必要はありませんgrep;)

だからそれは次のことを意味します:

$8 ~ /java/ && /catalina/ {print $2}

正規表現と一致し、行全体(明示的に使用することもできます)を正規表現と一致し、その項目がtrueの場合にフィールドを印刷するフィールド$8。 Gnoucが答えですでに言ったことを覚えておいてください。デフォルトの区切り文字はすでに空白です。これを定義する必要はありません。/java/$0/catalina/$2

答え3

次のコマンドでドル記号をエスケープする必要がありますawk

alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk '{print \$2}'"

そして、必ずしもデフォルトのフィールド区切り文字としてスペースを使用する-F' '必要はありません。awk

関連情報