如何获得内置命令的内置?
Posted
技术标签:
【中文标题】如何获得内置命令的内置?【英文标题】:How to get builtin of the builtin command? 【发布时间】:2013-02-18 22:57:48 【问题描述】:出于好奇,假设您创建了这个函数:
cd () echo 'hi';
现在,每当您输入 cd
时,都会打印出“hi”。如果您想使用原始的cd
命令,您可以执行以下操作:
builtin cd
但是如果我也创建了这个呢:
builtin() echo 'haha, got ya!';
现在,如何获取builtin
或cd
的内置命令?
【问题讨论】:
【参考方案1】:好的,首先不要覆盖builtin
命令,我假设你不是故意这样做的。鉴于您可以覆盖所有内置函数,我想出了一条更荒谬的路线:
#!/bin/bash
builtin() echo "Ha";
cd() echo "Ha";
pwd() echo "foobar";
result=$(/bin/bash --noprofile --norc -c "\\cd /home/cwgem/testdir; \\pwd; \\ls" )
/bin/echo "$result"
结果:
$ bash test.sh
/home/cwgem/testdir
test.txt
这里的想法是:
使用不能作为函数覆盖的函数的绝对路径(当然,这是假设您不会乱用/bin/bash
和 /bin/echo
)
利用 $()
是语法命令替换这一事实,而我无法覆盖它
用--noprofile
和--norc
调用bash
,这表明不在可能包含覆盖的常用文件中进行采购
最后\
's 添加在命令前面,以防别名浮动
也就是说,所有这些 hack 都是出于学术好奇心,不应该应用于现实世界。
【讨论】:
感谢您的精彩提示!【参考方案2】:在写下这个问题时,我想起了unset
命令。如果其他人想知道,您可以这样做:
unset builtin
和
unset cd
使原始命令按预期工作。如果有人有办法在不取消设置方法的情况下这样做,我很想知道如何做。
【讨论】:
也可以被覆盖:unset () echo 'Problem?';
【参考方案3】:
另一种选择是使用env -i
剥离环境及其别名和函数:
builtin() echo 'haha, got ya!';
builtin pwd
/usr/bin/env -i bash -c 'builtin pwd'
【讨论】:
以上是关于如何获得内置命令的内置?的主要内容,如果未能解决你的问题,请参考以下文章