是否可以检查在哪里定义了别名?


24

别名,例如llalias命令定义的。

我可以用类似type ll打印的内容检查命令

ll is aliased to `ls -l --color=auto'

command -v ll哪些印刷品

alias ll='ls -l --color=auto'

或者alias ll也可以打印

alias ll='ls -l --color=auto'

但我似乎无法找到那里的别名定义,即一个文件,如.bashrc在运行中的shell,或者手动。在这一点上,我不确定这是否可能。

我是否应该简单浏览所有加载的文件bash并检查每个文件?


袖手旁观bash -xl
杰夫·谢勒

Answers:


21

手动定义将很难发现(可能是历史记录),尽管要求shell显示它在做什么,然后grep应该有助于在rc文件中找到那些设置:

bash -ixlc : 2>&1 | grep ...
zsh -ixc : 2>&1 | grep ...

如果shell不能通过上述调用之一(以交互方式运行null命令)精确捕获必要的选项,则script

script somethingtogrep thatstrangeshell -x
...
grep ... somethingtogrep

另一种选择是使用类似的东西stracesysdig查找shell接触的所有文件,然后grep手动进行处理(如果shell或程序没有-x标志,则很方便);标准的RC文件不足以进行手动文件名检查,例如oh-my-zsh或特定于站点的配置是否正在从知道谁的位置拉入代码(或者也可能有环境变量,如sorontar在其答案中指出) 。


谢谢!即使输出有点难以解析,但是我发现了定义我要查找的别名的文件。当别名不在列表中的任何地方时,可以安全地假设别名是手动定义的吗?
polemon '16

@polemon有点安全;它可能是(或已经)在由于谁知道什么原因或被删除的原因而无法读取的文件中定义的(特别是如果存在某种外壳程序框架增加了用户不知道的复杂性)了解)。
2016年

1
为了使定义别名的点更容易找到,您可以使用PS4,它被添加到跟踪中的每一行:PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
Mark Plotnick

5

这是我发现grep -rl非常有用的地方:

grep -rl alias ~/.bash* ~/.profile /etc/profile /etc/bash.bashrc

会告诉您该单词在哪个文件alias中使用。

可能存在~/.bashrc,最~/.bash_aliases有可能存在。


但是,不可能绝对确定它涵盖所有选项。这些文件还可以调用或加载任何其他文件。环境变量,例如ENV或$BASH_ENV可能指示bash加载其他文件。

在环境中查找变量BASH_ENV,如果在变量BASH_ENV中出现该变量,则将其值扩展,并将扩展后的值用作要读取和执行的文件的名称。

甚至可以通过设置变量来定义别名(强调我的意思):

BASH_ALIASES
一个关联数组变量,其成员对应于内置别名所维护的别名内部列表。添加到此数组的元素出现在别名列表中


grep -rl alias ~/.bash*可能会错误地匹配历史记录文件,但会为+1指出BASH_ALIASES数组!
Jeff Schaller

2

我不知道一种实际列出别名源的方法,但是由于您似乎正在使用bash,因此我认为这些是可能的源文件:

/etc/profile
~/.profile
/etc/bash.bashrc
~/.bash_profile
~/.bashrc

您应该能够通过grep查找那些别名,例如grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc


或其中包含的文件...
Jeff Schaller

@JeffSchaller-是的,您需要像上面bash -x提到的那样更复杂的东西。我认为上面的代码很容易快速运行,如果找不到别名,则可以阅读执行步骤。
edaemon '16

1

thrig的答案@MarkPlotnick的建议结合使用,您可以测试是否BASH_ALIASES[ll]将其范围缩小。该BASH_SOURCE阵列和LINENO变量是特别有用的在这里。不幸的是,BASH_ALIASES[ll]只有设置别名,检查是否设置才会成功,因此第一行可能会完全位于另一个文件中。

PS4='${BASH_ALIASES["ll"]+"The ll alias has been defined before"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |&
  grep 'll alias' -m1 -B1

提供如下输出:

   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
TThe ll alias has been defined before /home/muru/.bashrc:116 alias 'ping=ping -c5'

您甚至可以使用以下检查来终止外壳程序:

$ PS4='${BASH_ALIASES["ll"]+"$(kill -9 $$)"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |& tail -n1
   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'

0

使用,我已经取得了成功which

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py

1
which可以在tcsh(可能是早期的csh)和zsh(内置)中处理别名,并可以在bash中使用RedHat系列的默认配置文件,该配置文件具有运行(外部)GNU程序的能力,但会向其提供shell别名数据,否则。更重要的是,它只告诉别名设置为什么,而不是别名在哪里设置,这里是Q。
dave_thompson_085 '18


-1

我终于ll在以下两个shell脚本中找到了我们的Web服务器(CentOS)的别名定义/etc/profile.d/

  • /etc/profile.d/colorls.csh
  • /etc/profile.d/colorls.sh

我发现它的第一次学习从上面在全系统的配置文件是评论:/etc/profile。该文件指出在中定义了系统范围的别名/etc/bashrc,在该文件中,我看到它在中遍历了多个shell脚本/etc/profile.d/,因此我grep在该目录中使用了该文件,最后找到了定义。我还发现有一个l.别名列出了所有的点文件:

来自colorls.sh

alias ll='ls -l --color=auto' 2>/dev/null
alias l.='ls -d .* --color=auto' 2>/dev/null
alias ls='ls --color=auto' 2>/dev/null

(中有等效的别名colorls.csh。)


-1

首先使用以下命令

列出所有功能

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.