如何获得内置命令的内置?

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!'; 

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

【问题讨论】:

【参考方案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'

【讨论】:

以上是关于如何获得内置命令的内置?的主要内容,如果未能解决你的问题,请参考以下文章

如何列出所有的 Bash Shell 内置命令 | Linux 中国

python内置库--argparse

如何查看shell内置命令?

WPF - 如何扩展(或并行工作)内置命令机制?

如何在 vim 中禁用内置命令

Bash基础——内置命令