编辑:@Kusalananda 回答后修改示例。我的整个情况更加复杂。我需要多个命令和变量定义)
我无法使用,su
因为我不是 root 并且我不想输入密码
我尝试模仿来自同事脚本的 su 代码:
# script runs as root
su - oracle -- "export DATA=$val; cat <<CHK
test
CHK"
Password:
test
以下不起作用(错误输出):
$ export val=534
$ sudo -i -u oracle -- "export DATA=$val;cat <<CHK
test
CHK"
-ksh: export DATA=534;cat <<CHKtestCHK: not found
[127]$
这都不是(根本没有输出):
$ sudo -i -u oracle -- ksh -c "export DATA=$val;cat <<CHK
test
CHK"
$
我明白某种程度上sudo
是扁平化输入,但是曼须藤仅在参数中提到这一点并用空格分隔,但这里不是这种情况。
答案1
您不需要将此处文档重定向作为您执行的命令的一部分sudo
:
sudo -u oracle env DATA="$val" cat <<END
this is
the here-document
END
该sudo
实用程序会将标准输入流传递给它执行的命令。该env
工具在执行给定实用程序之前修改环境。如上所示,将其与 一起使用sudo
是在要运行的实用程序中设置环境变量的一种方法,sudo
即使sudo
可能会清除大多数变量的环境。
如果您的命令比设置变量和运行更复杂cat
,请考虑收集需要sudo
在脚本中执行的操作,然后运行该脚本。
#!/bin/sh
export DATA="something"
cat <<END
this is
the here-document
END
请注意,该字符串something
也可以从脚本的命令行中获取。或者,您可以完全省略该语句,而是在执行脚本时如前所示DATA
设置:env
sudo env DATA="$var" ./myscript