为什么分配给 $path 会破坏我的 zsh 中的 $PATH?

为什么分配给 $path 会破坏我的 zsh 中的 $PATH?

一般指导(例如来自这里) 是在 shell 脚本中使用小写的变量名,以免与重要的 shell 环境变量(如)冲突PATH

然而,今天我了解到 MacOS 上的 $PATH 变量是不区分大小写

$ echo $PATH
/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

$ path=test      

$ echo $PATH
test

这肯定不是一件普遍的事情:

$ x=a          

$ echo $X

我认为它与不区分大小写的文件系统有某种关联,但我还没有找到关于它如何渗透到变量名区分大小写的合理解释。

一般的要点是“不要用作path变量名称”,但我仍然想知道是否有人可以解释这种令人惊讶的行为。

答案1

bash或其他 shell 相反,zshcsh& 也tcsh)将变量的内容$PATH作为数组提供$path

╭─user@machine ~/test ‹master●› 
╰─$ echo $PATH                 
/usr/local/sbin:/usr/local/bin:/usr/bin
╭─user@machine ~/test ‹master●› 
╰─$ echo $path[2]
/usr/local/bin

虽然这在某些情况下很有用,但它违反了典型的命名约定(全部大写) 在 POSIX 兼容系统上的环境变量,因为通常您可以在脚本中自由使用大多数小写变量。

请注意,变量仍然区分大小写:

╭─user@machine ~/test ‹master●› 
╰─$ pAtH=foo          
╭─user@machine ~/test ‹master●› 
╰─$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/bin
╭─user@machine ~/test ‹master●› 
╰─$ echo $pAtH   
foo

由于大多数脚本都是为其他系统编写的bash,并且zsh包含许多此类细微的、不明显的差异,这些差异有时会降低可用性或可移植性,因此我倾向于bash在脚本的集合中将其声明为解释器:

#!/bin/bash

或者

#!/usr/bin/env bash

相关内容