非常に奇妙なケースがあります... /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
には次のような記述がある
ほとんどすべての目的において、エイリアスはシェル関数に置き換えられます。
答え2
bashスクリプト内でaliasのような対話型機能を使用するには、対話型bashシェルで実行する必要があります。そのためには、最初の行に . を含めるように変更します-i
。新しいスクリプトファイルは次のようになります。
#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand
答え3
似たようなもの以前の質問しかし、その答えはやや冗長です。簡単に答えると、オカルト的な理由により、デフォルトではbashはスクリプト内で定義されたエイリアスを参照しません。shopt -s expand_aliases
スクリプトの先頭の行で明示的に参照するように指示する必要があります。そうすれば、スクリプトは何らかのコマンド。
答え4
shopt -sq expand_aliases
たとえば、UTF-8 エンコードでは次のコードを使用します。
#!/bin/bash
function запрещать() {
if [ $1 -eq 3 ]
then
echo -n "Запрещено. Код ошибки: "
echo `expr 2 \* 3 \* 47`
else
echo -n "."
запрещать `expr $1 + 1`
fi
}
#function запретить() {
# запрещать 1
#}
shopt -sq expand_aliases
alias запретить='запрещать 1'
запретить