非常に奇妙な状況が発生しました... / bin / bashを使用してスクリプトを実行すると、スクリプト内に設定したエイリアスも認識されません。そして最も奇妙なことは
$ cat -n test.sh
1 #!/bin/bash
2 alias somecommand='ls -alF'
3 alias
4 somecommand
$ ./test.sh
alias somecommand='ls -alF'
./test.sh: line 4: somecommand: command not found
...上記のようにスクリプトで "alias"コマンドを実行すると、結果はbash特定のコマンドエイリアスに入りますが、実行すると特定のコマンドそれ自体はまだ認識されていません!
"sh"コマンドを使用してスクリプトを実行すると、すべてが正しいです。もしそうなら、これはbashのバグですか?それとも私が何かを見逃しているのでしょうか?
助けてくれてありがとう!
ベストアンサー1
別の言葉使用スクリプトのエイリアス。スクリプトで対話的に使用するように設計された関数を使用することはほとんど意味がありません。代わりに、次の関数を使用してください。
somecommand () {
ls -alF
}
関数はエイリアスよりはるかに柔軟です。以下は、ほとんどエイリアスのように常に実行されるls
バージョンで、通常のバージョンls -F
(使用するフラグを含むに渡されたパラメータ)をオーバーロードします。$@
alias ls="ls -F"
ls () {
command ls -F "$@"
}
これにより、command
シェルが無限再帰に入るのを防ぎます。それ以外の場合は関数が呼び出されるためですls
。
エイリアスは次の操作を実行できません。
select_edit () (
dir=${1:-.}
if [ ! -d "$dir" ]; then
echo 'Not a directory' >&2
return 1
fi
shopt -s dotglob nullglob
set --
for name in "$dir"/*; do
[ -f "$name" ] && set -- "$@" "$name"
done
select file in "$@"; do
"${EDITOR:-vi}" "$file"
break
done
)
select_edit
これはディレクトリをパラメータとして使用し、ユーザーにそのディレクトリからファイルを選択するように要求する関数を生成します。選択したファイルが編集用にエディタで開きます。
マニュアルにはbash
次の内容が含まれています。
ほとんどすべての目的で、エイリアスはシェル関数に置き換えられます。