shell脚本与sudo sh

时间:2014-07-07 08:30:55

标签: bash shell

我想创建一个脚本来安装程序(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:语法错误:重定向意外

4 个答案:

答案 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选项且用户没有保留环境的权限,则安全策略可能会返回错误。