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

lms*_*ant 3 zsh environment-variables macos

一般指导(例如从这里开始)是在 shell 脚本中使用小写的 var 名称,以免与重要的 shell 环境变量(如PATH.

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

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

$ path=test      

$ echo $PATH
test
Run Code Online (Sandbox Code Playgroud)

这肯定不是一般的事情:

$ x=a          

$ echo $X
Run Code Online (Sandbox Code Playgroud)

我认为它在某种程度上与不区分大小写的文件系统有关,但我还没有找到合理的解释来解释它是如何泄漏到变量名区分大小写的。

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

mas*_*ice 6

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

\n
\xe2\x95\xad\xe2\x94\x80user@machine ~/test \xe2\x80\xb9master\xe2\x97\x8f\xe2\x80\xba \n\xe2\x95\xb0\xe2\x94\x80$ echo $PATH                 \n/usr/local/sbin:/usr/local/bin:/usr/bin\n\xe2\x95\xad\xe2\x94\x80user@machine ~/test \xe2\x80\xb9master\xe2\x97\x8f\xe2\x80\xba \n\xe2\x95\xb0\xe2\x94\x80$ echo $path[2]\n/usr/local/bin\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
\xe2\x95\xad\xe2\x94\x80user@machine ~/test \xe2\x80\xb9master\xe2\x97\x8f\xe2\x80\xba \n\xe2\x95\xb0\xe2\x94\x80$ pAtH=foo          \n\xe2\x95\xad\xe2\x94\x80user@machine ~/test \xe2\x80\xb9master\xe2\x97\x8f\xe2\x80\xba \n\xe2\x95\xb0\xe2\x94\x80$ echo $PATH\n/usr/local/sbin:/usr/local/bin:/usr/bin\n\xe2\x95\xad\xe2\x94\x80user@machine ~/test \xe2\x80\xb9master\xe2\x97\x8f\xe2\x80\xba \n\xe2\x95\xb0\xe2\x94\x80$ echo $pAtH   \nfoo\n
Run Code Online (Sandbox Code Playgroud)\n

由于大多数脚本都是为其他系统编写的bash,并且zsh包含许多如此小的不明显的差异,这些差异有时会影响其他系统的可用性或可移植性,因此我倾向于bash在脚本的 shebang 中声明为解释器:

\n
#!/bin/bash\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
#!/usr/bin/env bash\n
Run Code Online (Sandbox Code Playgroud)\n