出于好奇,假设您创建了这个函数:
cd () { echo 'hi'; }
现在,无论您何时输入,都会cd
打印出“hi”字样。如果您想使用原始cd
命令,可以执行以下操作:
builtin cd
但是如果我也创建了这个怎么办:
builtin() { echo 'haha, got ya!'; }
现在,您如何获得builtin
or的内置命令cd
?
出于好奇,假设您创建了这个函数:
cd () { echo 'hi'; }
现在,无论您何时输入,都会cd
打印出“hi”字样。如果您想使用原始cd
命令,可以执行以下操作:
builtin cd
但是如果我也创建了这个怎么办:
builtin() { echo 'haha, got ya!'; }
现在,您如何获得builtin
or的内置命令cd
?
好的,首先不要覆盖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
and的前提下/bin/echo
)$()
我无法覆盖它bash
,这在不采购可能包含覆盖的常用文件中是明确的--noprofile
--norc
\
被添加在命令前面,以防别名浮动也就是说,所有这些黑客都是出于学术好奇心,不应该应用于现实世界。
另一种选择是使用env -i
它的别名和功能剥离环境:
builtin() { echo 'haha, got ya!'; }
builtin pwd
/usr/bin/env -i bash -c 'builtin pwd'
unset
我在写下这个问题时想起了这个命令。如果其他人想知道,您可以这样做:
unset builtin
和
unset cd
使原始命令按预期工作。如果有人有办法在不取消设置方法的情况下这样做,我很想知道如何做。