让 . / source 工作,执行当前加载/来源的完全替换

让 . / source 工作,执行当前加载/来源的完全替换

如何执行./source执行当前加载/运行源代码脚本的完全替换,例如

$.bashscript

只需将命令/代码脚本添加到当前加载/运行的源脚本中,而如果恰好是相同的标识符名称,则可以替换

但是,请解释如何完全替换它,就好像它在获取新的之前清理当前加载/运行的源一样

答案1

没有简单的方法可以恢复任意命令。比较一下我的这个答案:为什么source不刷新.bashrc文件

你可以做的是开始新鲜的shell,然后 source 您想要的内容。您的问题已标记为. 有用Bash 的选项--noprofile--norc或者--rcfile filename

其他技巧:

  • exec program用 替换当前 shell program,PID 将保留。
  • env -i programprogram在空环境中运行。

因此,以下命令将用一个相当干净的 shell 替换您当前的 shell bash

cd / && exec env -i bash --noprofile --norc

该命令单独来看可能不是很有用,但可能是一个很好的起点。

笔记:

  • 这不会触及文件描述符。</dev/tty >/dev/tty 2>/dev/tty如果这是您想要的,请附加到命令,以确保将 stdin、stdout 和 stderr(分别为文件描述符 0、1 和 2)连接到控制终端(以防它们被重定向到其他地方)。可以使用以下循环关闭其他单个文件描述符(可能已打开):

    for i in {3..9}; do
       exec {i}>&-
    done
    unset i
    

    无论如何都不应使用更​​高的数字。)您可以将其放在文件中并使用--rcfile …而不是 来自动运行此循环--norc

  • 空环境意味着没有$TERM,所以你可能更喜欢

    env -i TERM="$TERM" bash …
    

    您可能希望保留其他环境变量:,,,,,,$SHELL...请$PAGER参阅$HOME$USER$PATH这个答案理论上,它们中的每一个都可能被您获取的某些东西所改变,因此依赖它们的当前值不一定是最好的主意。您可以明确指定所需的值。

  • 我们的交互式界面bash仍将使用默认的历史记录文件和相关设置,因此历史记录扩展可能会起作用,并且取决于您之前的操作。请参阅如何启动没有历史记录的 bash 会话

相关内容