为什么 sh/bash 在尝试设置环境变量时会设置命令行参数值?

Tou*_*uko 2 bash shell environment-variables sh command-line-arguments

关于基础知识的问题:在为从脚本启动的程序调整环境变量时,我最终对 sh 产生了一些奇怪的行为(这似乎实际上与 bash 相关联):变量设置似乎与命令行参数混淆。

有人可以解释为什么会发生这种情况吗?

一个简单的脚本:

#! /bin/sh

# Messes with $1 ??
set ANT_OPTS=-Xmx512M
export ANT_OPTS

# Works
# export ANT_OPTS=-Xmx512M

echo "0 = $0"
echo "1 = $1"
Run Code Online (Sandbox Code Playgroud)

当我使用上层替代(set + export)运行它时,结果如下:

$ ./test.sh foo
0 = ./test.sh
1 = ANT_OPTS=-Xmx512M
Run Code Online (Sandbox Code Playgroud)

但是使用较低的替代方案(直接导出),结果正如我所想的:

$ ./test.sh foo
0 = ./test.sh
1 = foo
Run Code Online (Sandbox Code Playgroud)

肯定有合乎逻辑的解释,只是我还没有弄清楚。有人有想法吗?

br,东子

Han*_*Gay 5

你应该只使用ANT_OPTS=-Xmx512M而不是set ANT_OPTS=-Xmx512M.

更新:有关和手册的讨论,请参见此处set