非常に奇妙なケースがあります.../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がsomecommandをエイリアスに取り込んだことがわかりますが、somecommandを実行するとそれ自体はまだ認識されません!
コマンド「sh」を使用してスクリプトを実行すれば、すべてが正しいので、bashのバグですか?それとも私が見逃しているものはありますか?
どんな助けでもありがたいです!
スクリプトでseエイリアスを使用しないでください。スクリプトでインタラクティブに使用するために設計された機能を使用することはほとんど意味がありません。代わりに、関数を使用します。
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
マニュアルには次のステートメントが含まれています
ほとんどすべての目的で、エイリアスはシェル関数に取って代わられました。
Bashスクリプト内でエイリアスのようなインタラクティブ機能を使用するには、インタラクティブbashシェルでそれを実行する必要があります。そのためには、最初の行を変更して-i
を含めます。したがって、新しいスクリプトファイルは
#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand
前の質問 の複製のようなものですが、答えは冗長です。簡単に言えば、オカルト上の理由から、デフォルトではbashはスクリプト内で定義されたエイリアスを調べません。上記のスクリプトの上部にあるshopt -s expand_aliases
行を使用して、そうするように明示的に指示する必要があります。それを行うと、スクリプトが見つかります いくつかのコマンド。
最初の行の後にshopt -s expand_aliases
を追加するだけです
#!/bin/bash
shopt -s expand_aliases
alias somecommand='ls -alF'
alias
somecommand
これは出力されます
$ /tmp/alias.sh
alias somecommand='ls -alF'
total 111044
drwxr-xr-x 4 sobi3ch sobi3ch 4096 Aug 22 14:27 ./
drwxr-xr-x 31 sobi3ch sobi3ch 4096 Aug 23 10:19 ../
デフォルトのエイリアスはインタラクティブシェルのみです(man bash
から)
expand_aliases
設定されている場合、エイリアスは上記の「エイリアス」で説明したように展開されます。このオプションは、対話型シェルではデフォルトで有効になっています。
新しいシェルとして実行する代わりにyour_scriptをソースし、スクリプトとエイリアスをソースするだけで受け入れられます
使用する 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'
запретить