Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在脚本中运行.profile_Linux_Bash_Unix - Fatal编程技术网

Linux 如何在脚本中运行.profile

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

当我在脚本下面运行时,我必须首先在脚本中运行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

当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