Why does an alias work in the Terminal, but not when called from a script?

1

I've added the following to my ~/.bash_profile

# opens "flashlog.txt" in Console
alias trace='open -a /Applications/Utilities/Console.app/ ~/Library/Preferences/Macromedia/Flash\ Player/Logs/flashlog.txt'

# clears "flashlog.txt"
alias cleartrace='cat /dev/null > ~/Library/Preferences/Macromedia/Flash\ Player/Logs/flashlog.txt'

So, in Terminal I can enter the command "trace" and view the flashlog.txt in the Console. I can also enter the command "cleartrace" and the flashlog.txt is cleared. These work great.

However, if I create a new bash script with the following I get an error "cleartrace: command not found":

#!/bin/bash
cleartrace
cp -v -f ActivityLauncher.swf ../launchers/addu02l05_launcher_1.swf
open "/Applications/Adobe Flash CS4/Players/Flash Player.app" ./test.swf 

Why does an alias work in the Terminal, but not when called from a script? (How do I fix it?)

Michael Prescott

Posted 2010-02-10T15:18:19.693

Reputation: 3 351

Answers

4

This is because bash only reads ~/.bash_profile for interactive shells. Move your alias definitions to ~/.bashrc and it should work. Take a look at the INVOCATION section of the bash manpage for more details on how this all works.

KeithB

Posted 2010-02-10T15:18:19.693

Reputation: 8 506

2

The Bash info file says:

For almost every purpose, shell functions are preferred over aliases.

Functions can be exported, for one thing.

Paused until further notice.

Posted 2010-02-10T15:18:19.693

Reputation: 86 075

Functions can also call other functions! (Aliases cannot) – sixtyfootersdude – 2010-03-09T15:03:25.823