Bashのif ... fiでエイリアス拡張を機能させる方法はありますか?

Bashのif ... fiでエイリアス拡張を機能させる方法はありますか?

次のスクリプトを確認してください。

#!/bin/bash
if true;then
    alias WeirdTest='uptime';shopt -s expand_aliases
    WeirdTest
fi
WeirdTest

初めてWeirdTest実行すると、「コマンドが見つかりません」と表示されます。

答え1

これはbashの制限です。マニュアル引用:

エイリアスの定義と使用に関する規則は多少混乱しています。

Bash はコマンドを読み取るとエイリアスを拡張します。この意味では、コマンドはif … fi完全なコマンド(完全なブロックは複合コマンドです)と完全な行(したがって… fi; WeirdTest改行を追加する代わりに、後に書くとfi2番目の発生WierdTestも拡張されません)で構成されます。スクリプトからifコマンドを読み取ると、WeirdTestエイリアスはまだ存在しません。

考えられる解決策は関数を定義することです。

if …; then
  WeirdTest () { uptime; }
  WeirdTest
fi
WeirdTest

同じ名前の外部コマンドを呼び出すためにエイリアスを使用するには、関数のcommand前に追加するだけです。

WeirdTest () { command WeirdTest --extra-option "$@"; }

関連情報