エイリアスと機能

エイリアスと機能

バッシュマニュアルから

エイリアスの定義と使用に関する規則は多少混乱しています。 Bash は、その行からコマンドを実行する前に、常に入力の行全体を 1 つ以上読みます。エイリアスは、コマンドの実行時ではなく、コマンドの読み込み時に拡張されます。したがって、他のコマンドと同じ行に表示されるエイリアス定義は、次の入力行を読むまで適用されません。行のエイリアス定義の後に続くコマンドは、新しいエイリアスの影響を受けません。この動作は関数の実行時にも問題になります。 エイリアスは、関数の実行時ではなく、関数定義の読み込み時に拡張されます。これは、関数定義自体が複合コマンドであるためです。その結果、 関数で定義されたエイリアスは、関数の実行後にのみ使用できます。。安全のために、常に別名定義を別々の行に配置し、複合コマンドに別名を使用しないでください。

「エイリアスは関数が実行されたときではなく、関数定義を読み取ると拡張されます」と、「関数で定義されたエイリアスはその関数が実行された後にのみ使用できます」という文は、矛盾しているようです。

それが何を意味するのかを説明できますか?

答え1

  1. エイリアスは、関数の実行時ではなく、関数定義の読み込み時に拡張されます。

    $ echo "速い茶色のキツネが怠惰な犬を飛び越えました。>私のファイル"
     
    $エイリアス myalias=cat
     
    $ myfunc() {
    > myalias myfile
    >}
     
    $myfunc
    敏捷な茶色のキツネは怠惰な犬の上に跳んだ。
     
    $エイリアス myalias="ls -l"
     
    $myalias myfile
    -rw-r--r-- 1 myusername mygroup 45 12月13日 07:07 myfile
     
    $myfunc
    敏捷な茶色のキツネは怠惰な犬の上に跳んだ。

    myfunccallで定義して myalias再定義しても、元の定義は引き続き実行されます。エイリアスは次のとおりです。myaliasmyfuncmyalias拡大する関数が定義されたら。実際、シェルはもはやmyfunc呼び出しを覚えていません。呼び出しについてのみmyalias知っています。myfunccat

    $型myfunc
    myfuncは関数です
    マイパンク()
    {
    私のファイルを猫
    }
  2. ...関数で定義されたエイリアスは、関数が実行された後にのみ使用できます。

    $ echo "速い茶色のキツネが怠惰な犬を飛び越えました。>私のファイル"
     
    $ myfunc() {
    >エイリアスmyalias = cat
    >}
     
    $myalias myfile
    -bash: myalias: コマンドが見つかりません。
     
    $myfunc
     
    $myalias myfile
    敏捷な茶色のキツネは怠惰な犬の上に跳んだ。

    この関数が実行されるまでエイリアスはmyalias使用できません。myfunc(エイリアスを定義した関数を定義するだけでもエイリアスが定義されるのがむしろ奇妙だと思います。)

答え2

私のコードで以下のスニペットを試すときは、最初の文に記載されている答えが必要です。.bashrc

alias ls='\ls -F --color=auto --show-control-chars'
alias ll='ls -ahl'
function lf_macro() {
    local CMD=${1:-ls} DIR=${2:-.};
    $CMD $(find $DIR -maxdepth 1 -type f);
}
function lf() { lf_macro ll "$1"; }
function lsf() { lf_macro ls "$1"; }     # list all file, no directories

その後unalias -a; source ~/.bashrc私は実行しようlfとしlsf

$ lf
-bash: ll: command not found

$ lsf
./file1 ./file2 ./script.sh ...     # no color, no control-chars

$ ls $(find -maxdepth 1 -type f)
./file1 ./file2 ./script.sh* ...

明らかに、エイリアスは関数が実行されるときではなく、関数が定義されるときに拡張されます。:

  • 実行するとlfエラーが発生し-bash: ll: command not foundます。
  • を実行すると、lsfエイリアス/usr/bin/ls形式が使用されず、カラーハイライトがなく、実行可能ファイルの後に制御文字がありません。

答え3

(例えば)と言うことができます。

エイリアス mvn="mvn -Dmaven.wagon.http.ssl.insecure=true $@"

IEでは、定義でエイリアス名を繰り返すことはできますが、関数を使用してこれを行うことはできません。 bashはスタックオーバーフローのみが発生し、終了します。

この問題を解決する方法があるかもしれませんが、それが何であるかはわかりません。

関連情報