特定のエイリアスが定義されている場合は、動作が異なる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"