如何找出别名(在 bash 意义上)是定义在运行终端在 Mac OS X

如何查找系统中定义别名的位置?我指的是从 Mac OS X (10.6.3)启动的终端会话中使用的别名。

例如,如果在 Terminal 命令提示符下输入没有参数的 alias命令,就会得到已经设置的别名列表,例如:

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

但是,我已经在各种启动文件中使用 Spotlight 和 mdfind搜索了整个系统,到目前为止还没有找到这个别名的定义位置。(我很久以前就这么做了,而且没有写下我把化名分配到了哪里)。

73058 次浏览

我找到了答案(我一直在盯着正确的文件,但是忽略了显而易见的部分)。

本例中的别名在文件 ~/. bash _ profile 中定义

我怎么就想不起来了。

您只需在命令提示符下键入 alias,就可以查看您有哪些别名。否则,您可以在定义别名的最常见位置执行 find,例如

grep -RHi "alias" /etc /root

我认为这可能类似于 Ghostdog74的意思,但是他们的命令不适合我。

我会试试这样的方法:

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 [[ grep -c "alias" ]] then <print file name>

以后还会提供标准的 bash 配置文件

  • /etc/profile
  • ~/. bash _ profile 或 ~/. bash _ login 或 ~/. profile
  • ~/. bash _ logout
  • ~/. bashrc

更多信息: http://www.heimhardt.com/htdocs/bashrcs.html

对于更复杂的设置(例如,当您使用 bash-it、 oh-my-zsh 等 shell 脚本框架时) ,在脚本的关键位置添加“ alias mysql”通常很有用。这将帮助您准确地确定何时添加别名。

例如:

echo "before sourcing .bash-it:"
alias mysql
. $HOME/.bash-it/bash-it.sh
echo "after sourcing bash:"
alias mysql

虽然有点晚了,但是我遇到了同样的问题(试图找到“ l”命令在 RHEL6中的别名) ,并且最终在前面的答案中没有提到的地方。它可能不会出现在所有 bash 实现中,但是如果/etc/profile.d/目录存在,那么可以尝试在那里对未解释的别名进行 grepping。我就是在那里发现的:

[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

Bash 手册中没有提到这个目录,也不是 bash 搜索配置文件/启动信息的正确位置,但是在 RHEL 中,您可以看到/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

对于 OSX 来说,这个2步序列对我来说很有用,它可以定位我很久以前创建的一个别名,但是无法定位到预期的位置(~/。Zhrc).

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'

啊哈! ~/.oh-my-zsh/lib/aliases.zsh中的“隐藏”。我在.oh-my-zsh 中查了一下,但是忽略了 lib/aliases.zsh。

在我的例子中,我使用 Oh My Zsh,因此我将别名定义放在 ~/. zhrc文件中。

试试: alias | grep name_of_alias 例句: alias | grep mysql

或者,如上所述

which name_of_alias

首先使用以下命令

列出所有函数

functions

列出所有化名

alias

如果没有找到别名或函数,可以考虑使用更积极的搜索方法

狂欢版

bash -ixlc : 2>&1 | grep thingToSearchHere

Zsh 版本

zsh -ixc : 2>&1 | grep thingToSearchHere

期权简介

-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

请检查您添加的自定义安装/addons/plugins,以及. zhrc/. bashrc/. profile 等文件

所以对我来说: 它是 git 别名为‘ g’。

$ which g
g: aliased to git

然后运行以下命令列出所有别名

$ alias

我发现了很多与 git 相关的别名,我知道我没有手动添加。 这让我开始思考我已经安装的软件包或配置

. oh-my-zsh 在这里,我运行以下命令:

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

你瞧,我找到了我的化名:

./plugins/git/git.plugin.zsh

查找别名可能被定义的位置的唯一可靠方法是使用 Dtruss分析由 bash打开的文件列表。

如果

$ csrutil status
System Integrity Protection status: enabled.

你将无法打开 bash,你可能需要一个副本。

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

然后使用

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

列出可以定义 alias的所有文件,如

/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
...