bash - 如何获取内置命令的内置?

标签 bash command-line unset

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

cd () { echo 'hi'; }

现在,每当您输入 cd 时,您都会看到“hi”。如果您想使用原始的 cd 命令,可以执行以下操作:

builtin cd

但是如果我也创建了这个呢:

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

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

最佳答案

好的,首先不要覆盖 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 ,这很明确,不在可能包含覆盖的常用文件中进行采购
  • 最后\在命令前面添加 ,以防别名 float

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

关于bash - 如何获取内置命令的内置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15208600/

相关文章:

linux - 通过fabric脚本在远程服务器上设置umask

windows - 有没有办法强制复制?在没有覆盖提示的情况下复制,使用 Windows?

macos - 为什么我不能在/etc/shells中添加fish?

php - 如何在 PHP 中取消设置 session 数组

php - 迭代期间取消设置数组值是否节省内存?

bash - 基于文件位置而不是当前工作目录的相对路径

linux - 将具有相同名称的文件夹分组

php - 如何在浏览器关闭时删除或取消设置 cookie?

linux - 使用 'sed' shell 命令部分替换字符串

windows - 如何在git bash下更改目录