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

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

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

エイリアスを定義する簡単な方法は、定義に単一引用符を使用し、エイリアスされたコマンドでは単一引用符を使用しないことです。ついでに、-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}

は、フィールドを$8正規表現と照合し/java/、行全体($0明示的に使用することもできます)を正規表現と照合し/catalina/、それらが真であれば、フィールドを出力します$2。Gnouc の回答ですでに述べられていることを思い出してください。デフォルトの区切り文字はすでに空白です。これを定義する必要はありません。

答え3

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

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

また、 を使用する必要はなく-F' 'awkデフォルトのフィールド区切りとしてスペースを使用します。

関連情報