如何构建内置命令?

时间:2013-03-04 18:36:43

标签: bash command-line unset

出于好奇,说你创造了这个功能:

cd () { echo 'hi'; }

现在,只要您输入cd,就会打印出“hi”。如果您想使用原始cd命令,则可以执行以下操作:

builtin cd

但是,如果我也创造了这个:

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

现在,您如何获得builtincd的内置命令?

3 个答案:

答案 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}},以防别名浮动

也就是说,所有这些黑客攻击都是出于学术上的好奇而不应该在现实世界中应用。

答案 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'