在ZSH中向PATH变量添加新条目

Dav*_*eto 136 linux ubuntu zsh

我正在使用zsh,我正在尝试向变量添加一个新的条目(/home/david/pear/bin),PATH但我不知道如何.

最让我困惑的是,PATH我的~/.zshrc文件中没有对变量的引用,但是echo $PATH返回:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Run Code Online (Sandbox Code Playgroud)

所以PATH变量正在某处设置.

Lin*_*ios 156

这里:

export PATH=/home/david/pear/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

  • 哈哈忘了它,我虽然这只是一个控制台命令,但是将该行添加到.zshrc就可以了.非常感谢! (24认同)
  • 谢谢,它的工作原理,但PATH不会被永久修改.如果我关闭终端并再次重新打开,我必须再次手动设置PATH.你知道如何永久改变这种变化吗? (14认同)
  • 我不得不删除条目周围的双引号,即`PATH ="/ home/david/pear/bin:/ usr/bin:etc"`到`PATH =/home/david/pear/bin:/ usr/bin:等等,它留在zshrc. (4认同)
  • @taco:我很确定这是因为〜是由shell扩展的,而PATH中的路径只能被较低级别的文件系统调用看到. (4认同)
  • @taco,你可以使用$ HOME (3认同)

ony*_*ony 131

实际上,使用ZSH允许您使用环境变量的特殊映射.所以你可以简单地做:

# append
path+=('/home/david/pear/bin')
# or prepend
path=('/home/david/pear/bin' $path)
# export to sub-processes (make it inherited by child processes)
export PATH
Run Code Online (Sandbox Code Playgroud)

对我来说,这是一个非常简洁的功能,可以传播到其他变量.例:

typeset -T LD_LIBRARY_PATH ld_library_path :
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.在我的例子中,`〜/ .zshrc`来自`.profile`,并覆盖`.profile`中的所有内容.花了一会儿拉我的头发想出来. (12认同)
  • 可以避免使用-x显式导出,而只将唯一值保留在带有-U的变量中,默认情况下使用冒号,因此可以是:typeset -TUx PATH path (5认同)
  • 我看到使用了“path”和“PATH”,两者都是单独的实体? (4认同)
  • 追加情况不需要括号,除非您要追加多个元素。它通常也不需要引号。所以简单、简短的附加方法是 (2认同)
  • @DanielSpringer,不。如果您希望使用这些术语,则:`path=(...)`(内部不引用`$path`或`$PATH`)分配,`path=(... $path)`前置,`path+( ...)` 附加。 (2认同)
  • 如果我想在 ' ' 中使用 $HOME 怎么办?路径 +=('$HOME/etc/etc') 似乎不起作用 (2认同)
  • @MinhNghĩa,`~` 由 shell 扩展。如果你把它放在引号中,比如“~/bin”或“~/bin”,那么它在你的路径中实际上就是 tilda。例如,您可以编写 `path+=(~/bin)` (注意没有引号)或类似的内容。如果您需要引用某些内容,您仍然可以像“path+=(~/'some path with space')”这样的部分进行引用。 (2认同)

Mic*_*ott 26

您可以以PATH最小的方式附加到您的身上.除非您附加多个元素,否则不需要括号.它通常也不需要引号.所以简单,简短的追加方式是:

path+=/some/new/bin/dir
Run Code Online (Sandbox Code Playgroud)

常用用法

然后,测试新脚本/可执行文件的常见模式变为:

path+=$PWD/.
# or
path+=$PWD/bin
Run Code Online (Sandbox Code Playgroud)

这种小写语法path用作数组,但也影响它的大写伙伴等价物PATH(它被"绑定"通过typeset).

(注意,没有:需要/希望作为隔板.)

相关花絮

path这种方式处理(作为数组)也意味着:无需执行a rehash来获取新的pathed命令.

另外,请看一下vared path动态的编辑方式path 和其他内容.

您可能只path对此问题感兴趣,但由于我们讨论的是导出和数组,请注意 通常无法导出数组.

您甚至可以防止PATH重复输入 (请参阅 此内容此内容):

typeset -U path
Run Code Online (Sandbox Code Playgroud)

  • 哇谢谢。我不知道zsh中的路径/ PATH。 (2认同)
  • “(请注意,不需要/不需要 : 作为分隔符。)” 这仅适用于小写的“路径”。`PATH` 需要前面有 `:`,如下所示 .zshrc `PATH+=:/Users/path/to/my/folder` (2认同)

Siv*_*een 21

一个班轮,没有打开~/.zshrc文件

echo -n 'export PATH=~/bin:$PATH' >> ~/.zshrc
Run Code Online (Sandbox Code Playgroud)

要么

echo -n 'export PATH=$HOME/bin:$PATH' >> ~/.zshrc
Run Code Online (Sandbox Code Playgroud)

要查看效果,请source ~/.zshrc在同一选项卡中执行或打开新选项卡

  • 使用 Zsh shell 在 OSX 上完美运行。 (2认同)

Dim*_*tar 9

选项1:将此行添加到〜/ .zshrc:

export "PATH=$HOME/pear/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

之后,您需要运行source ~/.zshrc以使更改生效,或者关闭此窗口并打开一个新窗口

选项2:在终端控制台内执行它,仅将此路径添加到当前终端窗口会话.关闭窗口/会话时,它将丢失.


MNa*_*sar 9

如果你使用的是 macOS(我使用的是 Monterey 12.3.1),你可能会像我比喻的那样揪着你的头发。这些说明首先在终端会话中对我有用,但无论我对导出做了什么,我都无法让它持续存在。此外,我在任何地方都找不到 .zshrc 。

事实证明苹果采取了不同的做法。您需要编辑的文件是etc/paths. 您可以简单地sudo nano /etc/paths将您的路径添加到新行中。然后只需重新启动终端即可。


小智 5

  1. 添加了〜/ .zshrc的路径

    sudo vi ~/.zshrc

    添加新路径

    export PATH="$PATH:[NEW_DIRECTORY]/bin"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更新〜/ .zshrc

    保存〜/ .zshrc

    source ~/.zshrc

  3. 检查路径

    echo $PATH

  • 这就是“Bash”方式。 (3认同)