【问题标题】:How to find out where alias (in the bash sense) is defined when running Terminal in Mac OS X在 Mac OS X 中运行终端时如何找出别名(在 bash 意义上)的定义位置
【发布时间】:2011-02-06 13:11:03
【问题描述】:

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

例如,如果我在终端命令提示符下输入不带参数的 alias 命令,我会得到我设置的别名列表,例如:

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

但是,我在各种启动文件中使用 Spotlight 和 mdfind 搜索了整个系统,但到目前为止找不到此别名的定义位置。 (我很久以前做过,没有写下我分配别名的位置)。

【问题讨论】:

标签: terminal alias bash


【解决方案1】:

对于 OSX,这 2 步序列对我来说效果很好,可以找到我很久以前创建的别名,但无法在预期的位置 (~/.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'

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

【讨论】:

  • 谢谢!
  • 这是蛮力但有效的,不需要任何猜测。似乎是最简单的方法。
  • 你可能会收到grep: warning: recursive search of stdin,运行它可能需要一些时间
  • @lacostenycoder 您可能在命令末尾省略了~ 参数,如果没有它,grep 将等待解析任何输入,而不是在本地搜索文件。
  • 这实际上是我正在寻找的确切别名,与同一个罪魁祸首 Oh-my-zsh。谢谢
【解决方案2】:

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

grep -RHi "alias" /etc /root

【讨论】:

  • 选项:-R, -r, --recursive:递归搜索列出的子目录,-H:始终打印带有输出行的文件名标题,-i, --ignore-case:执行不区分大小写的匹配。默认情况下,grep 区分大小写。
【解决方案3】:

首先使用以下命令

列出所有函数

functions 

列出所有别名

alias 

如果您没有找到别名或函数,请考虑更积极的搜索方法

Bash 版本

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

【讨论】:

  • :-ixc之后是什么意思,是要执行的命令吗?谢谢!
  • : 是一个shell内置,基本上相当于真正的命令。从历史上看,Bourne shell 没有 true 和 false 作为内置命令。
  • @Chad 见上文
  • 这太棒了!对我来说,在定义我的模式字符串pattern=someLongThing
  • 当有人感谢您的帮助时,永远感激(小费帽子)
【解决方案4】:

这些也是未来的标准 bash 配置文件

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

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

【讨论】:

  • /etc/bashrc 也可以看看。
  • 在某些机器上/etc/bashrc 可能被命名为/etc/bash.bashrc。无论如何,它在我的 Debian 7 机器上。
  • 此外,一些发行版将系统范围的设置放在/etc/bash/
【解决方案5】:

聚会有点晚了,但我遇到了同样的问题(试图找到“l.”命令在 RHEL6 中的别名),并最终出现在前面的答案中没有提到的地方。它可能不会在所有 bash 实现中找到,但如果 /etc/profile.d/ 目录存在,请尝试在此处查找无法解释的别名。那是我找到的地方:

[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

【讨论】:

    【解决方案6】:

    除了 .zshrc/.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

    【讨论】:

      【解决方案7】:

      我找到了答案(我一直盯着正确的文件,但错过了明显的)。

      在我的例子中,别名是在文件 ~/.bash_profile 中定义的

      不知何故,这让我感到困惑。

      【讨论】:

      • 谢谢,试过.bashrc和.bash_aliases,忘了是.bash_profile
      【解决方案8】:

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

      例如:

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

      【讨论】:

        【解决方案9】:

        我认为这可能类似于 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>

        【讨论】:

        • 而不是循环、反引号、查找、回显和 cat,一个简单的 grep -R alias . 将按照您的建议执行。然而,问题的症结在于看哪里
        【解决方案10】:

        唯一可靠的方法是通过使用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
        ...
        

        【讨论】:

          【解决方案11】:

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

          或者,如上所述

          which name_of_alias

          【讨论】:

            【解决方案12】:

            就我而言,我使用 Oh My Zsh,所以我将别名定义放在 ~/.zshrc 文件中。

            【讨论】:

            • 两年半前发布的详细信息。
            • 问题是他不记得我在 Mac OSX 中遇到的别名是在哪里定义的,所以我只给出了对我有用的文件位置(~/.zshrc)(我使用哦,我的 Zsh)。我真的不知道你说的更详细是什么意思。
            • 我的意思是,existing answer from Nov 2014 已经在这个答案中说了所有内容,并且还添加了更多内容。
            猜你喜欢
            • 1970-01-01
            • 2012-09-10
            • 2016-01-10
            • 2012-03-07
            • 2015-11-27
            • 2013-07-17
            • 2013-04-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多