一般指导(例如来自这里) 是在 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 相反,zsh
(csh
& 也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