takafumi blog

日々の勉強メモ

【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
$ 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

ただしデフォフォルト禁止されている事から、プロダクトで使うなどは止めた方がいいだろう。

今回は何故使いたかったかというと、MacGNU系コマンドをInstallした際にaliasでdate='gdate'みたいにしていたため、dateのオプションがプロダクト環境とローカルで事なる自体が発生したため。

なので基本はこういう、ローカル側でプロダクト環境との差異を埋めたいときに使うのがいいと思う。