Linux 如何在脚本中运行.profile
当我在脚本下面运行时,我必须首先在脚本中运行SU并运行一个配置文件。该配置文件向终端提供日志,并且在profiel中解析参数,或者不解析下一行。提前感谢Linux 如何在脚本中运行.profile,linux,bash,unix,Linux,Bash,Unix,当我在脚本下面运行时,我必须首先在脚本中运行SU并运行一个配置文件。该配置文件向终端提供日志,并且在profiel中解析参数,或者不解析下一行。提前感谢 if [ $owner = "user1" ] then su -c " . ~/.profile; cd $LOG_DOR; cat $job.log" - user1 else echo "$owner not found" fi 要将文件读入当前shell,请使用source source ~/.profile 当sh
if [ $owner = "user1" ]
then
su -c " . ~/.profile; cd $LOG_DOR; cat $job.log" - user1
else
echo "$owner not found"
fi
要将文件读入当前shell,请使用
source
source ~/.profile
当shell解析双引号字符串时,它会在执行命令之前对内容进行变量扩展(用变量的值替换
$varname
)。在这种情况下,由于LOG\u DOR
和job
变量是在~/.profile(而不是脚本)中定义的,这意味着
su -c " . ~/.profile; cd $LOG_DOR; cat $job.log" - user1
将扩大到:
su -c " . ~/.profile; cd ; cat .log" - user1
这根本不是你想要的。要延迟变量的展开,可以使用单引号而不是双引号:
su -c ' . ~/.profile; cd $LOG_DOR; cat $job.log' - user1
但我实际上也会推荐一些其他的更改:在变量引用周围加上双引号,以避免它们展开时可能出现的问题,并使用&&
(而不是;
)连接命令,以便在一个失败时跳过其余部分(而不是盲目地尝试继续):
编辑:显然在本例中,脚本中定义了作业
,而~/.profile中定义了LOG\u DOR
;因此,$job
的扩展应该立即完成,而$job\u DOR
的扩展应该推迟。幸运的是,对于需要延迟的扩展,可以使用双引号和转义(\
)$
。您还需要转义一些其他特殊字符,如包含的双引号(如果不转义,将以字符串结尾)。在这里,我还切换到了$job
引用周围的单引号,以防它包含任何特殊字符,否则会造成麻烦(尽管如果它本身包含任何单引号,这将失败):
$LOG\u DOR
和$job
是在当前脚本中定义的还是由~/.profile定义的?因为它们在这里用双引号括起来,所以在将命令字符串传递给su
命令之前,它们将在脚本上下文中展开。配置文件,我如何克服它?您可以引用该命令,或使用su-
启动登录shell。非常感谢Gordon提供的详细解决方案变得更加关键。。现在问题是“$LOG\u DOR”
来自~/。配置文件和“$job”
在脚本中定义。有什么解决办法吗?找到了。。我导出了export$job=$1
su -c '. ~/.profile && cd "$LOG_DOR" && cat "$job.log"' - user1
su -c ". ~/.profile && cd \"\$LOG_DOR\" && cat '$job.log'" - user1