特定のエイリアスが定義されているかどうかをテストする方法は?

特定のエイリアスが定義されているかどうかをテストする方法は?

特定のエイリアスが定義されている場合は、動作が異なるbashスクリプトがあります。 bashで特定のコマンドがエイリアスかどうかをテストする方法はありますか?

答え1

aliasエイリアスなしで渡されると、定義され=valueたエイリアス定義のみが印刷され、このクラス名がないとエラーで失敗します。

だからあなたはこれを行うことができます:

if alias your_alias_name >/dev/null 2>&1; then 
  do_something
else 
  do_another_thing; 
fi

(your_alias_name必要に応じて交換)

答え2

私はそれをしたい@jimmijコメント5年前答えを入力してください:

type -tこの目的のために設計されています。alias与えられたコマンドがエイリアスの場合に出力されます。コマンドが存在しない場合は何も出力されません。つまり、標準エラーやその他のアイテムをリダイレクトする必要はありません。

例:

if [ "$(type -t foo)" = 'alias' ]; then
    echo 'foo is an alias'
else
    echo 'foo is not an alias'
fi

-tこのスイッチは POSIX で定義されていません。 Bash以外のシェルではこれを実装できない可能性があります。

答え3

警告の言葉:

シェル機能とエイリアスはシェルに限定され、シェルスクリプトの実行には影響しません。

発見中https://askubuntu.com/a/98796、私自身の痛みを伴う経験がこれを確認します。

やや面倒なことは、文書に明示的に言及されていないことです。Bashユーザーマニュアルの関連セクション、唯一のヒントは

Aliasの拡張はデフォルトで行われます(Aliasingを参照)。

これは私にとって十分に直感的ではありません。

言い換えれば、他の答えで言及されたすべての技術は同じスクリプトで定義されているエイリアスを確認する場合にのみ機能します。(または他のファイルのsourceスクリプトに-dを追加します)。エイリアスがスクリプトを呼び出すシェルで定義されているかどうか(非対話型)スクリプトでは確認できません。

aliastest.sh以下は問題を示す小さなスクリプトです。

#!/usr/bin/env bash

shopt -s expand_aliases

is_alias() {
    if [[ "$(type -t $1)" == "alias" ]]; then
        echo "$1 is an alias"
    else
        echo "Cannot find $1"
    fi
}

# == MAIN ==

if [[ $# -lt 1 ]]; then
    echo "Usage: $0 <command> [ <command> ...]"
    exit 1
fi

for cmd in $@; do
    is_alias $cmd
done

これはll、コマンドを使用してシェルに定義された共通のエイリアスがあると仮定しますalias ll='ls -alF'(おそらくすでに持っているでしょう)。実行してみると./aliastest.sh llこんな感じですCannot find ll

しかし、絶望しないでください。解決策があります:

Bashにスクリプトを「対話的に」実行するように指示すると、スクリプトを呼び出したシェルで定義されたエイリアスが「表示」されます。

bash -i aliastest.sh ll

と答えるだろうll is an alias

答え4

このように書くことができます

[[ $(type your_alias) == *"alias" ]] && echo "alias defined" || echo "alias undefined"

例:

[[ $(type fd) == *"alias" ]] && echo "fd is an alias" || echo "fd is not an alias"

別のオプションは次のとおりです。

[[ -z $(alias | grep 'll=') ]] && echo "alias not found" || echo "alias found"

関連情報