ifでエイリアスが機能しないのはなぜですか?

ifでエイリアスが機能しないのはなぜですか?

.bashrc必要に応じて使用できるように複数のエイリアスを設定し、そのうちの1つを自動的に実行します。

対話型シェルを使用するのではなく、自動化されたスクリプトがマイコンピュータにSSHとして接続されたときに、いくつかの問題が発生したことがわかりました。したがって、この問題を解決するために、ifブロックに入れて、自動化スクリプトに対して定義または実行されないようにしました。

if [ -n "$TERM" ] && [ "$TERM" != "dumb" ] ; then
    alias short='long command here'
    alias another='very long command here'
    # ...

    short
fi

ただ見てshort: command not found

最小限に抑えましょう...

$ cat alias.sh
alias foo='echo hi'
foo
$ sh alias.sh
hi
cat alias-in-if.sh
if true ; then
        alias foo='echo hi'
        foo
fi
sh alias-in-if.sh
alias-in-if.sh: line 3: foo: command not found

最初のスクリプトは機能しますが、2番目のスクリプトは機能しないのはなぜですか?

(私は自分の質問に答えました。)

答え1

私は周りを検索した結果、ifs内のエイリアスに関連するものは何も見つからず、関数内のエイリアスだけが見つかりました。最初は他の問題のように見えました。

しかし、実際には、この回答それを修正する:

Bash は、その行からコマンドを実行する前に、常に入力の行全体を 1 つ以上読みます。 [...]この行のエイリアス定義に続くコマンドは、新しいエイリアスの影響を受けません。 [...] 安全のため、常に別名定義を別々の行に配置し、複合コマンドに別名を使用しないでください。

これは関数に限定されず、if文も含まれているようです。完全なifブロックは1行として扱われます。エイリアスは、条件がtrueの場合にのみ定義および実行され、条件がfalseの場合でも定義されないようにするには、次のように条件を2回評価することをお勧めします。

cat alias-before-if.sh
if true ; then
        alias foo='echo hi'
fi

if true; then
        foo
fi
$ sh alias-before-if.sh
hi

だから私の元のスクリプトは次のようになります。

if [ -n "$TERM" ] && [ "$TERM" != "dumb" ] ; then
    alias short='long command here'
    alias another='very long command here'
    # ...
fi

if [ -n "$TERM" ] && [ "$TERM" != "dumb" ] ; then
    short
fi

関連情報