【Bash】 スクリプト中のaliasコマンドが実行できない
環境 archlinux 4.14.4-1
非インタラクティブモードではaliasは展開されない。
非インタラクティブとは
$ bash test.sh
みたいに実行する事。
普通に実行すると以下のようになる
$ cat ~/.bashrc alias ll='ls -la' $ bash test.sh test.sh: line 5: ll: command not found
BASH_ENV
で.bashrcを読み込ませてみる
$ BASH_ENV=~/.bashrc bash test.sh alias ll='ls -la' test.sh: line 5: ll: command not found
aliasは読み込まれるが、実行しようとすると展開されない。
対処法
man bash
にちゃんと書いていた。
Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt
スクリプト中か、実行時オプションで expand_aliases
を指定すればOK。
- オプション実行
$ BASH_ENV=~/.bashrc bash -O expand_aliases test.sh alias ll='ls -la' -rw-r--r-- 1 takafumi takafumi 18 Dec 12 22:06 /home/takafumi/.bashrc
- スクリプト中に
shopt
を追加
$ cat test.sh #!/bin/bash shopt -s expand_aliases alias; ll ~/.bashrc $ BASH_ENV=~/.bashrc bash test.sh alias ll='ls -la' -rw-r--r-- 1 takafumi takafumi 18 Dec 12 22:06 /home/takafumi/.bashrc
ただしデフォフォルト禁止されている事から、プロダクトで使うなどは止めた方がいいだろう。
今回は何故使いたかったかというと、MacにGNU系コマンドをInstallした際にaliasでdate='gdate'
みたいにしていたため、dateのオプションがプロダクト環境とローカルで事なる自体が発生したため。
なので基本はこういう、ローカル側でプロダクト環境との差異を埋めたいときに使うのがいいと思う。