エイリアスまたは bash 機能が機能しない

エイリアスまたは bash 機能が機能しない

私が作るとき

alias wd='ps -ef | grep java | awk {'print $2 " " $9'} | egrep "(A|B|C|D)"'

または

function wd () {
    ps -ef | grep java | awk '{print $2}' ...
}

.bashrc ファイルにエラーが発生します。興味深いことに、この関数を使用して.bashrcファイルをインポートすると「コンパイル」されますが、実行すると次の結果が表示されます。

 context is
     >>> \ <<< {\print
    missing }

エイリアスよりも関数に何かを入れることがいつより良いか、誰かがこれを特定して答えるのを助けることができますか?

答え1

エイリアスが機能しない理由

alias wd='ps -ef | grep java | awk {'print $2 " " $9'} | egrep "(A|B|C|D)"'

このaliasコマンドは3つのパラメーターを受け取ります。最初は文字列ですwd=ps -ef | grep java | awk {print。一重引用符は、その間の文字が特別な意味を持たないようにします。 2番目のパラメータは単一の空白文字で構成されています。 (では、.bashrc位置引数$2$9が空であるため、ゼロ$2ワードリストに展開されます。)3番目の引数は} | egrep "(A|B|C|D)"(やはり一重引用符で特殊文字を保護します)です。

エイリアス定義が見つかると、他のシェルコマンドと同様に解析されます。エイリアスに定義された文字列は、エイリアスが展開されると解析されます。このエイリアスを定義するいくつかの可能な方法は次のとおりです。最初の可能性:完全エイリアス定義は一重引用符内にあるため、コマンドは二重引用符のみを使用します。これは、awk"とバックスラッシュを使用して保護する必要があることを意味します。$

alias wd='ps -ef | grep java | awk "{print \$2 \" \" \$9}" | egrep "(A|B|C|D)"'

2番目の可能性:各文字は、リテラル文字列を終了する一重引用符を除いて、一重引用符内に自分自身を表します。'\''「一重引用符内の一重引用符」の慣用語です。一重引用符で囲まれた文字列を終了し、リテラル一重引用符を入れて、すぐに新しい一重引用符で囲まれた文字列を開始します。間にスペースがないので、まだ同じ単語です。

alias wd='ps -ef | grep java | awk '\''{print $2 " " $9}'\'' | egrep "(A|B|C|D)"'

少し単純化できます。

alias wd='ps -ef | grep java | awk '\''{print $2, $9}'\'' | egrep "(A|B|C|D)"'

ヒント:set -xシェルがコマンドを拡張する方法を確認するために使用されます。

機能が機能しない理由

わかりません。見せてくれた部分は大丈夫そうです。説明を説明しても機能が機能しない理由がまだわからない場合は、コードをコピーして貼り付けてください。

エイリアスや機能?

一般に、一般的に使用されるコマンドに短い名前を指定するか、基本オプションを提供するために非常に単純な場合にのみエイリアスを使用してください。例:

alias grep='grep --color'
alias cp='cp -i'
alias j=jobs

より複雑な作業には関数を使用してください。

あなたは何を書くべきですか?

出力を解析するのではなく、代わりにps自分に適した出力を生成するようにしてください。

wd () {
  ps -C java -o pid=,cmd= | egrep "(A|B|C|D)"
}

答え2

エイリアスの問題は、引用符を直接入れ子にすることができないことです(特別な場合の内部を除く$())。内面の境界から外れなければなりません。

alias wd='ps -ef | grep java | awk {\'print $2 " " $9\'} | egrep "(A|B|C|D)"'
#                                   ^^               ^^

私は正確に指摘できない多くの関数型を削除しましたが、エラーフラグメントが引用awkまたはシェル変数拡張の問題で発生し、提案しています。

一般に、関数はエイリアスよりも柔軟性がありますが(エレメント拡張以外のエイリアスを使用した引数処理を制御することはできません)、エイリアスはより速く、エイリアスを空白で終わると、最初の引数がコマンド(テーブルの完成など)エイリアスは宣言されたファイル内でも何の影響もありません(無限エイリアス拡張ループを避けるため)。

答え3

エイリアスにパラメータを渡すことはできないと思います。エイリアスは、コマンドの最初の単語の文字列置換規則です。
例:

alias wd='ps -ef | grep java | awk {'print $2 " " $9'} | egrep "(A|B|C|D)"'

コマンドはwd arg1 arg2 arg3次のように置き換えられ、実行されます。

ps -ef | grep java | awk {'print " " '} | egrep "(A|B|C|D)" arg1 arg2 arg3

他のすべてに関数を使用してください。

関連情報