我试图在运行脚本之前为用户会话设置环境变量:
su - myUser -c "export myVar=$toto ; sh scriptThatNeedsMyVar.sh"
脚本失败,我尝试调试并打印 myVar 值:
su - myUser -c "export myVar=$toto ; echo $myVar"
没有返回任何内容,这意味着我的环境变量没有被创建,尽管我在同一个 bash 中创建并打印它!然后当我以用户身份登录myUser
并在 bash 控制台中输入每个命令时,它运行良好
$su - myUser
$export myVar=toto
$echo $myVar
toto
我是不是漏掉了什么?
为什么会发生这种情况?我如何以其他用户身份导出临时变量(我无权编辑 bashrc 或任何其他系统文件)
答案1
使用env
:
su - myUser -c "env myVar=\"$toto\" scriptThatNeedsMyVar.sh"
当然,假设scriptThatNeedsMyVar.sh
是可执行的,并且可以在中找到myUser
,PATH
并且以 开头#!/bin/sh
。
答案2
作为Byte Commander 详解,您必须将命令放在单引号中,以防止 Bash 扩展变量。如果$toto
必须在原始 shell 中扩展,请将其作为命令列表之外的参数提供,并以以下方式访问它$0
:
su - myUser -c 'export myVar="$0"; echo $myVar' "$toto"