エイリアスと機能

エイリアスと機能

バッシュマニュアルから

エイリアスの定義と使用に関する規則は多少混乱しています。 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(エイリアスを定義した関数を定義するだけでもエイリアスが定義されるのがむしろ奇妙だと思います。)

おすすめ記事