别名,例如ll
使用命令定义的别名alias
。
type ll
我可以用诸如which prints之类的东西检查命令
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
并检查每一个文件?
答案1
尽管要求 shell 显示它正在做什么,但手动定义将很难被发现(也许是历史日志),然后grep
应该帮助找到 rc 文件中设置的那些:
bash -ixlc : 2>&1 | grep ...
zsh -ixc : 2>&1 | grep ...
如果 shell 没有通过上述调用之一(交互运行 null 命令)精确捕获必要的选项,则script
:
script somethingtogrep thatstrangeshell -x
...
grep ... somethingtogrep
另一种选择是使用类似strace
或sysdig
查找全部shell 接触的文件,然后手动访问grep
这些文件(如果 shell 或程序没有-x
标志,则很方便);标准 RC 文件不足以进行手动文件名检查,如果像 oh-my-zsh 或特定于站点的配置之类的东西从谁知道哪里提取代码(或者也可能存在环境变量,正如 sorontar 在他们的答案中指出的那样) 。
答案2
首先使用以下命令
列出所有函数
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
答案3
这是我觉得grep -rl
非常有用的地方:
这个命令
grep -rl alias ~/.bash* ~/.profile /etc/profile /etc/bash.bashrc
会告诉您在哪个文件中alias
使用了该单词。
如果它存在的话,它很可能就在~/.bashrc
,并且肯定在~/.bash_aliases
。
然而,不可能绝对确定该搜索涵盖了所有选项。这些文件还可以调用或加载文件系统中其他任何位置的文件。 ENV 等环境变量$BASH_ENV
可能会指示 bash 加载其他一些文件。
在环境中查找变量 BASH_ENV,如果它出现在那里,则扩展它的值,并使用扩展后的值作为要读取和执行的文件的名称。
甚至可以通过设置变量来定义别名(重点是我的):
BASH_ALIASES
一个关联数组变量,其成员对应于由内置别名维护的别名内部列表。添加到此数组的元素出现在别名列表中
答案4
我不知道如何实际列出别名的来源,但由于看起来您正在使用 bash,我认为这些是可能的源文件:
/etc/profile
~/.profile
/etc/bash.bashrc
~/.bash_profile
~/.bashrc
您应该能够通过这些来查找别名,例如grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc
。