85

How can I find out where an alias is defined on my system? I am referring to the kind of alias that is used within a Terminal session launched from Mac OS X (10.6.3).

For example, if I enter the alias command with no parameters at a Terminal command prompt, I get a list of aliases that I have set, for example:

alias mysql='/usr/local/mysql/bin/mysql'

However, I have searched all over my system using Spotlight and mdfind in various startup files and so far can not find where this alias has been defined. ( I did it a long time ago and didn't write down where I assigned the alias).

pjmorse
  • 9,204
  • 9
  • 54
  • 124
Richard Fuhr
  • 3,195
  • 3
  • 22
  • 14
  • This question is (now) off-topic for StackOverflow, and it was answered [on Unix&Linux.SE](https://unix.stackexchange.com/questions/38330/how-can-i-find-a-rogue-alias-declaration). – Dan Dascalescu Jun 25 '17 at 05:40
  • I'm voting to close this question as off-topic because it belongs to U&L (https://unix.stackexchange.com/questions/38330/how-can-i-find-a-rogue-alias-declaration) or SuperUser. – Dan Dascalescu Jun 25 '17 at 05:40

12 Answers12

74

For OSX, this 2-step sequence worked well for me, in locating an alias I'd created long ago and couldn't locate in expected place (~/.zshrc).

cweekly:~ $ which la
la: aliased to ls -lAh

cweekly:~$ grep -r ' ls -lAh' ~
/Users/cweekly//.oh-my-zsh/lib/aliases.zsh:alias la='ls -lAh'

Aha! "Hiding" in ~/.oh-my-zsh/lib/aliases.zsh. I had poked around a bit in .oh-my-zsh but had overlooked lib/aliases.zsh.

Drew Gaynor
  • 8,292
  • 5
  • 40
  • 53
cweekly
  • 8,706
  • 1
  • 22
  • 17
38

you can just simply type in alias on the command prompt to see what aliases you have. Otherwise, you can do a find on the most common places where aliases are defined, eg

grep -RHi "alias" /etc /root
ghostdog74
  • 327,991
  • 56
  • 259
  • 343
  • 4
    Options: `-R, -r, --recursive`: Recursively search subdirectories listed, `-H`: Always print filename headers with output lines, `-i, --ignore-case`: Perform case insensitive matching. By default, grep is case sensitive. – Hugo Feb 25 '19 at 12:10
29

First use the following commands

List all functions

functions 

List all aliases

alias 

If you aren't finding the alias or function consider a more aggressive searching method

Bash version

bash -ixlc : 2>&1 | grep thingToSearchHere

Zsh version

zsh -ixc : 2>&1 | grep thingToSearchHere

Brief Explanation of Options

-i     Force shell to be interactive.

-c     Take the first argument as a command to execute

-x      -- equivalent to --xtrace

-l      Make bash act as if invoked as a login shell
jasonleonhard
  • 12,047
  • 89
  • 66
19

Also in future these are the standard bash config files

  • /etc/profile
  • ~/.bash_profile or ~/.bash_login or ~/.profile
  • ~/.bash_logout
  • ~/.bashrc

More info: http://www.heimhardt.com/htdocs/bashrcs.html

sixtyfootersdude
  • 25,859
  • 43
  • 145
  • 213
8

A bit late to the party, but I was having the same problem (trying to find where the "l." command was aliased in RHEL6), and ended up in a place not mentioned in the previous answers. It may not be found in all bash implementations, but if the /etc/profile.d/ directory exists, try grepping there for unexplained aliases. That's where I found:

[user@server ~]$ grep l\\. /etc/profile.d/*
/etc/profile.d/colorls.csh:alias l. 'ls -d .*'
/etc/profile.d/colorls.csh:alias l. 'ls -d .* --color=auto'
/etc/profile.d/colorls.sh:  alias l.='ls -d .*' 2>/dev/null
/etc/profile.d/colorls.sh:alias l.='ls -d .* --color=auto' 2>/dev/null

The directory isn't mentioned in the bash manpage, and isn't properly part of where bash searches for profile/startup info, but in the case of RHEL you can see the calling code within /etc/profile:

for i in /etc/profile.d/*.sh ; do
  if [ -r "$i" ]; then
    if [ "${-#*i}" != "$-" ]; then
      . "$i"
    else
      . "$i" >/dev/null 2>&1
    fi
  fi
done
Stovey
  • 160
  • 2
  • 5
2

Please do check custom installations/addons/plugins you have added, in addition to the .zshrc/.bashrc/.profile etc files

So for me: it was git aliased to 'g'.

$ which g
g: aliased to git

Then I ran the following command to list all aliases

$ alias

I found a whole lot of git related aliases that I knew I had not manually added. This got me thinking about packages or configurations I had installed. And so went to the

.oh-my-zsh directory. Here I ran the following command:

$ grep -r 'git' . |grep -i alias

And lo and behold, I found my alias in :

./plugins/git/git.plugin.zsh

wat er
  • 361
  • 2
  • 5
1

For more complex setups (e.g. when you're using a shell script framework like bash-it, oh-my-zsh or the likes) it's often useful to add 'alias mysql' at key positions in your scripts. This will help you figure out exactly when the alias is added.

e.g.:

echo "before sourcing .bash-it:"
alias mysql
. $HOME/.bash-it/bash-it.sh
echo "after sourcing bash:"
alias mysql
user1372408
  • 426
  • 1
  • 4
  • 10
1

I found the answer ( I had been staring at the correct file but missed the obvious ).

The aliases in my case are defined in the file ~/.bash_profile

Somehow this eluded me.

Richard Fuhr
  • 3,195
  • 3
  • 22
  • 14
0

I think that maybe this is similar to what ghostdog74 meant however their command didn't work for me.

I would try something like this:

for i in `find . -type f`; do   # find all files in/under current dir
echo "========" 
echo $i                         # print file name
cat $i | grep "alias"           # find if it has alias and if it does print the line containing it
done

If you wanted to be really fancy you could even add an if [[ grep -c "alias" ]] then <print file name>

Community
  • 1
  • 1
sixtyfootersdude
  • 25,859
  • 43
  • 145
  • 213
  • 3
    Rather than loop, backtick, find, echo, and cat, a simple `grep -R alias .` will do what you suggest. The crux of the question however is *where to look*. – dimo414 Sep 26 '13 at 20:23
0

The only reliable way of finding where the alias could have been defined is by analyzing the list of files opened by bash using dtruss.

If

$ csrutil status
System Integrity Protection status: enabled.

you won't be able to open bash and you may need a copy.

$ cp /bin/bash mybash
$ $ codesign --remove-signature mybash

and then use

sudo dtruss -t open ./mybash -ic exit 2>&1 | awk -F'"' '/^open/ {print substr($2, 0, length($2)-2)}'

to list all the files where the alias could have been defined, like

/dev/dtracehelper
/dev/tty
/usr/share/locale/en_CA.UTF-8/LC_MESSAGES/BASH.mo
/usr/share/locale/en_CA.utf8/LC_MESSAGES/BASH.mo
/usr/share/locale/en_CA/LC_MESSAGES/BASH.mo
/usr/share/locale/en.UTF-8/LC_MESSAGES/BASH.mo
/usr/share/locale/en.utf8/LC_MESSAGES/BASH.mo
/usr/share/locale/en/LC_MESSAGES/BASH.mo
/Users/user/.bashrc
/Users/user/.bash_aliases
/Users/user/.bash_history
...
Diego Torres Milano
  • 65,697
  • 9
  • 111
  • 134
-5

Try: alias | grep name_of_alias Ex.: alias | grep mysql

or, as already mentioned above

which name_of_alias

Blckmamba
  • 1
  • 1
-8

In my case, I use Oh My Zsh, so I put aliases definition in ~/.zshrc file.

ryan
  • 7
  • 2
  • Posted with more detail two and a half years ago. – Nathan Tuggy Apr 06 '17 at 03:56
  • The question is that he can't remember where aliases are defined in Mac OSX which I had run into, so I just give the file location(~/.zshrc) that worked for me(I use Oh My Zsh). I really don't know what do you mean about more detail. – ryan Apr 06 '17 at 04:39
  • 2
    I mean, an [existing answer from Nov 2014](https://stackoverflow.com/questions/2614403/how-to-find-out-where-alias-in-the-bash-sense-is-defined-when-running-terminal/43245187#26742455) already said everything in this answer and added more as well. – Nathan Tuggy Apr 06 '17 at 04:41