1

When I run the alias command, I see an alias which I don't know where it has been defined (i.e. I cannot find the file which contains definition of this alias). I have checked /etc/profile, ~/.bashrc, ~/.profile, ~/.bash_profile, ~/.bash_login, /etc/bash.bashrc and some others but to no avail.

Is there a way to find out which files the alias command gets its info from? I mean how does the alias command work? Does it read some predetermined files looking for alias definitions?

1
  • The list of available aliases isn't defined in any specific place; it's the result of all of the alias <name>=<definition> commands that have been executed in that shell process since it started. Shells automatically run the commands in the various init scripts at startup (which files are run depends on how the which shell program it is, how it's started, etc). Those can run other scripts (with the source or . commands). You can also define aliases manually. To find out where a particular alias is coming from, you have to trace the shell startup process. Commented Nov 1, 2017 at 0:47

1 Answer 1

5

Along the lines of Stéphane's similar answer, here's a way to run an interactive bash shell in trace mode (running the single command exit), piped to a grep that shows only the source and alias commands; the source command immediately above the alias of interest should be the file that contains the alias command.

bash -ix -c exit 2>&1 | grep -E 'source | \. |alias '

An instrumented run:

$ tail -1 ~/.bashrc
[ -f /tmp/a.bashrc ] && source /tmp/a.bashrc
$ cat /tmp/a.bashrc
[ -f /tmp/b.bashrc ] && . /tmp/b.bashrc
$ cat /tmp/b.bashrc
alias answer='echo 42'

$ bash -ix -c exit 2>&1 | grep -E 'source | \. |alias '
+ alias 'ls=ls --color=auto'
+ source /tmp/a.bashrc
++ . /tmp/b.bashrc
+++ alias 'answer=echo 42'
5
  • For me, this command (bash -ix ..) only shows the aliases, no source. I guess this is because . can be used instead of source.
    – LoMaPh
    Commented Nov 1, 2017 at 1:45
  • Excellent point; I'll update the grep statement accordingly.
    – Jeff Schaller
    Commented Nov 1, 2017 at 1:46
  • I like PS4=' ${BASH_SOURCE}:$LINENO ' bash -lixc exit | grep ... for debugging.
    – muru
    Commented Nov 1, 2017 at 2:27
  • @JeffSchaller Thanks. I'm still having trouble finding the file. "the source command immediately above the alias of interest should be the file that contains the alias command." it seems this wasn't the case for me. I'll look more into it tomorrow and let u know.
    – LoMaPh
    Commented Nov 1, 2017 at 2:35
  • Ok. I found the problem. The alias was set through set-alias command (module environment). When I ran your suggested command, in the output the path /etc/profile.d/modules_environment.sh which loads user-defined modules as well appeared 4 lines above the alias definition.
    – LoMaPh
    Commented Nov 1, 2017 at 2:54

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .