出于好奇,说你创造了这个功能:
cd () { echo 'hi'; }
现在,只要您输入cd
,就会打印出“hi”。如果您想使用原始cd
命令,则可以执行以下操作:
builtin cd
但是,如果我也创造了这个:
builtin() { echo 'haha, got ya!'; }
现在,您如何获得builtin
或cd
的内置命令?
答案 0 :(得分:2)
好的,首先请不要覆盖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
)$()
是语法命令替换的事实,我无法覆盖bash
和--noprofile
呼叫--norc
,这些\
明确表示不会在可能包含覆盖的常规文件中采购也就是说,所有这些黑客攻击都是出于学术上的好奇而不应该在现实世界中应用。
答案 1 :(得分:0)
我在记下这个问题时记得unset
命令。如果其他人想知道,你可以这样做:
unset builtin
和
unset cd
使原始命令按预期工作。如果有人有办法在不取消设置方法的情况下这样做,我会有兴趣知道如何。
答案 2 :(得分:0)
另一种选择是使用env -i
以其别名和函数去除环境:
builtin() { echo 'haha, got ya!'; }
builtin pwd
/usr/bin/env -i bash -c 'builtin pwd'