エイリアスと関数


17

bashマニュアルから

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

「関数が実行されるときではなく、関数定義が読み取られるときにエイリアスが展開される」と「関数が定義されたエイリアスは、その関数が実行されるまで使用できない」という2つの文は相反するようです。

それぞれの意味を説明できますか?


良い質問!今日は何か新しいものを学びました。実際には、2つのことを学びました。1)関数defの読み取り時のエイリアス拡張に関する情報、および2)bashマニュアルを注意深く読む必要があること(すでにやったと思いましたが、明らかにしませんでした^^ )
オリビエデュラック

4
主な質問は、非インタラクティブモードでエイリアスを使用する必要があるかどうかです。それが関数の目的であり、エイリアスはスクリプトのエラーを起こしやすくします。.bashrc一番上のファイルのエイリアスにしか出会っていないので、実際には上記の情報は必要ありません。
オリオン

回答:


29
  1. エイリアスは、関数の実行時ではなく、関数定義の読み取り時に展開されます…

    $ echo「素早い茶色のキツネが怠zyな犬を飛び越えます。」> myfile
     
    $エイリアスmyalias = cat
     
    $ myfunc(){
    > myalias myfile
    >}
     
    $ myfunc
    速い茶色のキツネは怠laな犬を飛び越えます。
     
    $ alias myalias = "ls -l"
     
    $ myalias myfile
    -rw-r--r-- 1 myusername mygroup 45 Dec 13 07:07 myfile
     
    $ myfunc
    速い茶色のキツネは怠laな犬を飛び越えます。

    myfuncを呼び出すように定義されていたにもかかわらずmyalias、私は再定義しましたがmyaliasmyfuncまだの元の定義を実行しmyaliasます。関数が定義されたときにエイリアスが展開されたため。実際、シェルはそのmyfunc呼び出しを覚えていませんmyalias。それがmyfunc呼び出すことだけを知っていますcat

    $タイプmyfunc
    myfuncは関数です
    myfunc()
    {
    猫のマイファイル
    }
  2. …関数で定義されたエイリアスは、その関数が実行されるまで利用できません。

    $ echo「素早い茶色のキツネが怠zyな犬を飛び越えます。」> myfile
     
    $ myfunc(){
    >エイリアスmyalias = cat
    >}
     
    $ myalias myfile
    -bash:myalias:コマンドが見つかりません
     
    $ myfunc
     
    $ myalias myfile
    速い茶色のキツネは怠laな犬を飛び越えます。

    myaliasまで、エイリアスは使用できないmyfunc機能が実行されました。(エイリアスを定義する関数を定義するだけでエイリアスを定義できるとしたら、かなり奇妙だと思います。)


4
+1、良い答え。これに対する重要な「当然の結果」は、スクリプトで関数とエイリアスを定義する場合、エイリアス定義を関数定義の前に置くことです。(明らかに、今は答えを与えられましたが、私はこれを知りませんでした)。
オリビエデュラック

ありがとう。根本的な問題は、関数の定義の実行と関数の呼び出しの違いだと思います。具体的には、関数の定義の実行中および関数の呼び出し中に、それぞれどのシェル操作が実行されますか?関数の定義の実行と関数の呼び出しの両方で実行されるシェル操作はありますか、または関数の定義の実行と関数の呼び出しはシェル操作の重複しないセットを実行しますか?
すべてのStackExchange

まあ、それは車を作ることと車を運転することの違いに少し似ています。または、サンドイッチを買ってサンドイッチを食べます。あなたの他の質問に対するより詳細な答えを提供しました。
G-Manは「Reinstate Monica」と言います

ありがとう。bashマニュアルの引用と返信を読み直した後、関数を実行する意味について混乱しています。関数の定義を実行するのですか、それとも関数を呼び出すのですか?unix.stackexchange.com/q/384209/674
StackExchange for All、

1

私は私のスニペットの下にしようとすると、最初の文で述べられている答えが必要.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ではなく、別名形、色なしのハイライト、および実行可能ファイルの後には制御文字を使用しています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.