我想创建一个脚本来安装程序(ROS),我需要编写这一行:
sudo sh -c 'echo "TEXT VARIABLE TEXT" > systemFile' # to write in systemaFile I need sudo sh
如果echo只是固定文本,它可以工作。 如果echo是text + variable,则它不起作用。
我试过了:
read f1 < <(lsb_release -a | grep Code* | cut -f2) #codename is writted in variable $f1
echo $f1 # retruns "quantal" as I expected
sudo sh -c 'echo "TEXT $f1 TEXT" > systemFile' #f1 is empty, WHY?
然后我必须在相同的指令sudo sh中分配变量,例如:
sudo sh -c'读取f1&lt; &lt;(lsb_release -a | grep Code * | cut -f2); echo“TEXT $ f1 TEXT”&gt; systemFile'
sh:1:语法错误:重定向意外
答案 0 :(得分:2)
这也可以起作用:
sudo sh -c "echo 'TEXT $VARIABLE TEXT' > systemFile"
但是,通常不建议不必将命令作为sudo运行。您似乎只希望重定向为“sudo
ed”。所以尝试以下选项:
echo "TEXT $VARIABLE TEXT" | sudo tee systemFile >/dev/null
echo "TEXT $VARIABLE TEXT" | sudo dd of=systemFile
echo
可以是简单的echo,也可以是您想要的任何其他命令。请注意,此命令未在sudo
下运行。
答案 1 :(得分:1)
请尝试像这个脚本行
sudo sh -c 'echo TEXT '$f1' TEXT > systemFile'
sudo bash -c 'echo TEXT '$f1' TEXT > systemFile'
我在.sh文件中使用了这个强大的脚本行,并且工作正常。
答案 2 :(得分:0)
Shell变量仅在&#34;双引号&#34;中展开,而不是在单引号&#39;。
$ v=value
$ echo $v
value
$ echo "$v"
value
$ echo '$v'
$v
您正在启动sh
的新实例,然后运行命令echo "TEXT $f1 TEXT" > systemFile
。
由于在新流程中尚未分配$f1
,因此它为空。
要解决此问题,您可以展开$f1
并在命令行中传递它:
sudo sh -c 'echo "TEXT '$f1' TEXT" > systemFile'
或导出它以便子进程可以使用(使用-E
来保护环境,感谢anishsane):
export f1
sudo -E sh -c 'echo "TEXT $f1 TEXT" > systemFile'
答案 3 :(得分:0)
使用-E
选项运行sudo
:
sudo -E sh -c 'echo "TEXT VARIABLE TEXT" > systemFile'
来自man sudo
:
-E
-E(保留环境)选项向安全策略指示用户希望保留其现有环境变量。如果指定了-E选项且用户没有保留环境的权限,则安全策略可能会返回错误。