シェルスクリプト(bash)内では、デフォルトでaliasを使用できません。使用するにはshoptコマンドを使って、明示的に有効化する必要があります。
aliastest.sh
#!/usr/bin/bash
shopt -s expand_aliases
alias myecho='echo myecho'
myecho
$ ./aliastest.sh
myecho
ただしシェルスクリプト利用時は、aliasが展開されるタイミングを考慮しないと少しハマります。
aliasはスクリプト読み込み時 (関数の定義読み込み時) に展開されます
これはbashのmanにも以下のように説明されています。
Aliases are expanded when a command is read, not when it is executed.
そのため、関数内でaliasを使用する場合、aliasの定義のタイミングが重要になります。以下のようにmyfunc1()内の後ろでmain_aliasを定義した場合、command not found となります。
※ 以下は、myfunc1()の実行結果が把握しやすいように、sedで整形しています。
aliastest1.sh
#!/usr/bin/bash
shopt -s expand_aliases
myfunc1() {
echo "----myfunc1()内でmain_alias実行-------------"
main_alias
echo "--------------------------------------------"
}
alias main_alias="echo main alias"
myfunc1
$ ./aliastest1.sh
----myfunc1()内でmain_alias実行-------------
./aliastest1.sh: line 6: main_alias: command not found
--------------------------------------------
main_aliasの定義をmyfunc1関数の前に書けば正常に動作します。
aliastest2.sh
#!/usr/bin/bash
shopt -s expand_aliases
alias main_alias="echo main alias"
myfunc1() {
echo "----myfunc1()内でmain_alias実行-------------"
main_alias
echo "--------------------------------------------"
}
myfunc1
$ ./aliastest2.sh
----myfunc1()内でmain_alias実行-------------
main alias
--------------------------------------------
関数の定義読み込み時に展開されるため、関数内でaliasを定義しても
「その関数は実行されていない = aliasが定義されていない」
ためエラーとなります。
aliastest3.sh
#!/usr/bin/bash
shopt -s expand_aliases
alias main_alias="echo main alias"
myfunc1() {
echo "----myfunc1()内でmain_alias実行-------------"
main_alias
echo "--------------------------------------------"
myfunc1_alias="echo myfunc1 alias"
echo "----myfunc1()内でmyfunc1_alias実行----------"
myfunc1_alias
echo "--------------------------------------------"
}
myfunc1
$ ./aliastest3.sh
----myfunc1()内でmain_alias実行-------------
main alias
--------------------------------------------
----myfunc1()内でmyfunc1_alias実行----------
./aliastest3.sh: line 11: myfunc1_alias: command not found
--------------------------------------------
また関数内でのaliasの定義は、同じシェル内で実行されていれば実行元の関数にも反映されます。
aliastest4.sh
#!/usr/bin/bash
shopt -s expand_aliases
alias main_alias="echo main alias"
echo "---- main()内で定義されているalias一覧 1--------"
alias
echo "------------------------------------------------"
myfunc1() {
alias myfunc1_alias="echo myfunc1 alias"
}
myfunc1
echo "---- main()内で定義されているalias一覧 2--------"
alias
echo "------------------------------------------------"
$ ./aliastest4.sh
---- main()内で定義されているalias一覧 1--------
alias main_alias='echo main alias'
------------------------------------------------
---- main()内で定義されているalias一覧 2--------
alias main_alias='echo main alias'
alias myfunc1_alias='echo myfunc1 alias'
------------------------------------------------
スコープはシェル変数と同じのようです。( ) やパイプを使ってサブシェルで実行したり、他のファイルを実行した場合(子プロセスの場合)にも引き継ぐことはできません。
※ パイプを使うと、パイプの左の式もサブシェルで実行されます
aliastest5.sh
#!/usr/bin/bash
shopt -s expand_aliases
alias main_alias="echo main alias"
myfunc1() {
alias myfunc1_alias="echo myfunc1 alias"
}
myfunc1 | true
echo "---- main()内で定義されているalias一覧 1--------"
alias
echo "------------------------------------------------"
(myfunc1)
echo "---- main()内で定義されているalias一覧 2--------"
alias
echo "------------------------------------------------"
./aliastest5_sub.sh
echo "---- main()内で定義されているalias一覧 3--------"
alias
echo "------------------------------------------------"
aliastest5_sub.sh
#!/usr/bin/bash
shopt -s expand_aliases
alias sub_alias="echo sub alias"
$ ./aliastest5.sh
---- main()内で定義されているalias一覧 1--------
alias main_alias='echo main alias'
------------------------------------------------
---- main()内で定義されているalias一覧 2--------
alias main_alias='echo main alias'
------------------------------------------------
---- main()内で定義されているalias一覧 3--------
alias main_alias='echo main alias'
------------------------------------------------
子プロセスとして./aliastest5_sub.sh で呼び出すのではなく source コマンドを使って実行すれば、サブシェルにならないため alias を引き継ぐことができます。
aliastest6.sh
#!/usr/bin/bash
shopt -s expand_aliases
alias main_alias="echo main alias"
source ./aliastest5_sub.sh
echo "---- main()内で定義されているalias一覧----------"
alias
echo "------------------------------------------------"
$ ./aliastest6.sh
---- main()内で定義されているalias一覧----------
alias main_alias='echo main alias'
alias sub_alias='echo sub alias'
------------------------------------------------
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。