2

出于好奇,假设您创建了这个函数:

cd () { echo 'hi'; }

现在,无论您何时输入,都会cd打印出“hi”字样。如果您想使用原始cd命令,可以执行以下操作:

builtin cd

但是如果我也创建了这个怎么办:

builtin() { echo 'haha, got ya!'; }

现在,您如何获得builtinor的内置命令cd

4

3 回答 3

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/bashand的前提下/bin/echo
  • 利用语法命令替换这一事实,$()我无法覆盖它
  • 调用and bash,这在不采购可能包含覆盖的常用文件中是明确的--noprofile--norc
  • finally\被添加在命令前面,以防别名浮动

也就是说,所有这些黑客都是出于学术好奇心,不应该应用于现实世界。

于 2013-03-05T04:34:26.067 回答
0

另一种选择是使用env -i它的别名和功能剥离环境:

builtin() { echo 'haha, got ya!'; }
builtin pwd
/usr/bin/env -i bash -c 'builtin pwd'
于 2014-11-20T13:33:00.757 回答
0

unset我在写下这个问题时想起了这个命令。如果其他人想知道,您可以这样做:

unset builtin

unset cd

使原始命令按预期工作。如果有人有办法在不取消设置方法的情况下这样做,我很想知道如何做。

于 2013-03-04T18:36:43.473 回答