Command line 为什么关闭终端窗口并打开新窗口有时是解决方案?

Command line 为什么关闭终端窗口并打开新窗口有时是解决方案?,command-line,Command Line,有时,当我调试一个从命令行运行的程序时,一个看似明显的更改直到我关闭终端窗口,打开一个新窗口,然后再试一次才起作用。我在Mac OS(即bash)和Windows上都遇到过这种情况 当显而易见的解决方案失败时,这是我最后的选择,但我想知道原因。它是否与命令行程序在创建快照时“捕获”快照有关?shell可以散列已知的二进制文件(因此它们不必搜索路径) 在更改系统范围的环境变量时,需要启动一个新的shell来获取新的环境。注意,由于子进程从其父进程继承其环境,仅输入子shell是不起作用的,我不确定

有时,当我调试一个从命令行运行的程序时,一个看似明显的更改直到我关闭终端窗口,打开一个新窗口,然后再试一次才起作用。我在Mac OS(即bash)和Windows上都遇到过这种情况


当显而易见的解决方案失败时,这是我最后的选择,但我想知道原因。它是否与命令行程序在创建快照时“捕获”快照有关?

shell可以散列已知的二进制文件(因此它们不必搜索路径)


在更改系统范围的环境变量时,需要启动一个新的shell来获取新的环境。注意,由于子进程从其父进程继承其环境,仅输入子shell是不起作用的,我不确定,但这可能与记住命令名所指的可执行文件有关,例如,如果您一直在使用
/usr/bin/foo
,然后创建
/usr/local/bin/foo
,外壳可能看不到后者。(虽然我觉得这不是问题)。
hash-r
在Bash中是一个不太激进的修复方法。有人能扩展一下“shell可以散列已知的二进制文件”吗?我知道哈希是什么;当命令即将被执行时,它是否会被使用?当更改系统范围的环境变量时,您需要启动一个新的shell来获得新的环境。好吧,我就是这么想的。有人能说更多关于为什么你需要开始一个新的shell吗?shell不能知道所有环境变量的当前状态有什么原因吗?谢谢。@Gregg:部分是根据定义;UNIX有着这样的悠久历史。它的主要用途是安全性:防止对环境的操纵,以防止破坏PATH/LIBPATH/LD_LIBRARY_PATH等可用于执行不受信任的代码。扩展而言,它用于隔离进程:某些进程将需要自定义路径等。如果子进程以某种方式从“新的全局环境”启动,它们将无法正常工作,因为它们依赖于与其父进程相同的环境