【发布时间】:2021-03-23 13:41:41
【问题描述】:
我正在尝试运行一个简单的 shell (Centos 7) 来打印系统 HOSTNAME 变量:
test.sh
#!/bin/ksh
echo "HOSTNAME:"$HOSTNAME
当从 bash 或 ksh 执行时,shell 无法按预期工作
>ksh ./test.sh ----> HOSTNAME is unset
>./test.sh ----> HOSTNAME is unset
如果我创建一个声明和导出 HOSTNAME 的 ~/.profile,则没有任何变化。 如果我创建一个 ~./kshrc,那么该源 ~./profile 只有在我从 bash 切换到 ksh 并执行脚本时才有效。
如果我从 bash 运行以下代码,由于交互模式,它确实可以工作
ksh -xi ./test.sh
+ command . ./.profile
+ HOSTNAME=<MYNAME>
+ export HOSTNAME
+ export HOSTNAME
+ echo HOSTNAME:<MYNAME>
HOSTNAME:<MYNAME>
没有交互模式 ~/.profile 没有加载
+ echo HOSTNAME:
HOSTNAME:
由于一堆使用 HOSTNAME 变量的脚本,即使在 ksh 中我也需要设置原始 HOSTNAME
PS:我已经尝试打印 PATH 变量,即使 HOSTNAME 没有,它也能正常工作
你能给我一些建议吗?
【问题讨论】:
-
您需要
export HOSTNAME。这几乎可以肯定是重复的。 -
你的
.kshrc几乎肯定不是.bashrc的来源。如果您想共享设置,请将它们放入.profile- 并确保您不使用任何 Bash 或 Ksh 语法 - 然后在必要时从特定于 shell 的启动文件中使用source。 (例如,如果.bash_profile两者都存在,则 Bash 更喜欢.profile;前者通常应该是source后者。) -
如果变量已经是
exported,则有东西正在替换它的值。如果这是您的私有变量,请不要使用大写,因为这与系统变量冲突。另见stackoverflow.com/questions/673055/… -
无法访问您的启动文件,这是不得不说的。阅读
ksh手册页和/或试验其调试选项(猜测ksh -xi;不在我可以测试的地方)。 -
.profilevs.bashrc可能与您的问题无关,但是对于不是特定于 Bash 的内容重载.bashrc通常是有问题的。.profile文件正是用于此目的。
标签: bash shell environment-variables centos7 ksh