我们有一个由httpd作为默认ec2-user执行的脚本。但是,执行时脚本没有看到该用户的任何环境变量
该变量在用户ec2-user
myUseVarHome=/home/ec2-user
myScript.sh
#!/bin/bash
myFolder="${myUseVarHome}/test/www"
USER=$(whoami)
echo "Content-type: text/html"
echo ""
echo "hello $USER"
echo "myFolder=$myFolder"
执行脚本ec2-user
输出
hello ec2-user
myFolder=/home/ec2-user/test/www
然后我们设置httpd 2.4 conf
<IfModule unixd_module>
User ec2-user
Group ec2-user
</IfModule>
现在用
调用脚本wget 127.0.0.1/myScript.sh
输出
hello ec2-user
myFolder=/test/www
输出验证httpd用户为ec2-user
,与手动执行脚本相同,但env变量${myUseVarHome}
为空或不存在。
这是预期的行为还是我们需要在以httpd用户身份执行时以另一种方式调用env变量?
答案 0 :(得分:1)
bash
或perl
), python
的行为都不同。 / p>
根据设计,~/.bash_profile
,~/.bashrc
等中的设置可供用户在bash
播放外壳的滚动时设置内容(登录壳,相互作用壳)。考虑一下xterm
(交互式shell)或ssh
会话(登录shell)或控制台(登录shell)中的环境。
另一方面,bash
也是一种强大的编程语言 - 关于用于管理systemd
中的服务的许多脚本的思考 - 这需要不同的工作方式。例如,当开发人员编写系统脚本或bash
程序时,他/她不太可能自动获取用户定义的~/.bash_profile
。这是一个普通的程序,而不是shell。正常程序(包括bash
程序)在当前工作的evironement(shell)中自然会 inherrit 设置,但不会设置。
如果我们在cron
中为bash
编写一个程序,那么它恰好用bash
写成;事实上,我们可以用python
或perl
或任何其他编程语言编写它 - 然后,我们可以选择bash
的{{1}}来源(阅读:用户shell的设置,恰好与编程语言的语言相同):
~/.bash_profile
但是,如果该特定用户不使用[ -f /home/user/.bash_profile ] && . /home/user/.bash_profile
作为他/她的shell,该怎么办?他/她可能会使用bash
,'ksh zsh
fish`等等。因此,在编写程序供公众使用时,这种做法并不真正有效。
因此,如果您认为有效,可以提供,
。但是,在这里,它不是关于我们是否能够获取文件,而是关于事物应该如何在系统中起作用:设计概念。简而言之:我们应该将~/.bash_profile
视为具有2个卷的内容:shell和编程语言。然后一切都会清晰,易于理解。