如何管理 PATH

How to manage PATH

提问人:Micah Elliott 提问时间:9/14/2023 最后编辑:Micah Elliott 更新时间:9/14/2023 访问量:190

问:

我希望能够轻松/经常以交互方式更改我的环境变量。在其他外壳中,这真的很容易;例如,附加 Zsh:PATH

path+=/some/path

对于 Nushell,文档说等效于:

$env.PATH = ($env.PATH | split row (char esep) | append '/some/path')

必须为交互式 shell 键入内容有点疯狂。但这似乎也有效,而且几乎是合理的:

let-env PATH = ($env.PATH|append /some/path)

(顺便说一句,为什么文档$env都提到了这两个。路径 = ...let-env PATH = ... 方法?哪个是首选,为什么?

为了使其更合理,感觉需要这样的东西(在我的 中),但我想知道:这种方法可以附加到 PATH 吗?config.nu

def-env path-append [d] { let-env PATH = ($env.PATH | split row (char esep) | append $d) }
...
path-append /some/path

此外,这是从 PATH 中删除条目的正确方法吗

$env.PATH # see that entry 37 is unwanted
let-env PATH = ($env.PATH|drop nth 37) # remove 37th entry

# so then this is even better (also in my config.nu)?
def-env path-drop [n] { let-env PATH = ($env.PATH|drop nth $n) }
path-drop 37

奖励:Zsh 必须以交互方式编辑诸如 .怒族有这样的等价物吗?varedPATH

nushell的

评论


答:

2赞 NotTheDr01ds 9/14/2023 #1

请注意,您引用的用于添加到路径的文档假设您在启动时通过 .文档还提到,该步骤的原因是:env.nusplit row (char esep)

因为 中,从主机进程继承的环境变量仍然是字符串。环境变量到 Nushell 值的转换步骤发生在读取配置文件之后(另请参阅“环境”部分)。env.nu

我在这里分离出最重要的一句话:

之后,例如在Nushell REPL中当是一个列表,可以直接使用。PATH/Pathappend/prepend

因此,以交互方式(又名“在 Nushell REPL 中”),您可以将其缩短为:

$env.PATH = ($env.PATH | append '/some/path')

为什么文档会同时提到两者和方法?哪个是首选,为什么?$env.PATH = ...let-env PATH = ...

如果文档中仍有部分引用 ,您应该针对该(或 PR)打开一个问题,因为在最近的版本中已从 Nushell 中删除。 是可变的,所以没有理由再这样做了。let-envlet-env$envlet-env

这种方法可以附加到 吗?PATH

对于交互使用,请删除上述部分。也可使用:split...$env

def-env path-append [d] { $env.PATH = ($env.PATH | append $d) }

这是从中删除条目的正确方法吗?PATH

当然,这将起作用,假设您进行了与上述相同的修改(而不是 )。$envlet-env

如果你喜欢这样的东西,你可能会变得更漂亮:

def-env path-remove [d] {
    $env.PATH = ( $env.PATH | 
        each {|p|
            if $p != $d { $p }
        }
    )
}

然后你可以打电话给path-remove /some/path

Zsh 必须以交互方式编辑诸如 .怒族有这样的等价物吗?varedPATH

不是我能想到的。 会给你一个很好的只读视图,但在这种情况下,与默认的表视图相比,并没有真正的改进。但是,我想不出编辑的等价物。$env.PATH | explore