【问题标题】:Shell script with sudo sh带有 sudo sh 的 Shell 脚本
【发布时间】:2014-07-07 16:59:52
【问题描述】:

我想制作一个脚本来安装程序(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 systemFile'

sh: 1: 语法错误:重定向意外

【问题讨论】:

  • & regd 为什么你的命令不起作用:变量扩展不会发生在单引号内。

标签: bash shell


【解决方案1】:

请像这个脚本行一样尝试

sudo sh -c 'echo TEXT '$f1' TEXT > systemFile'
sudo bash -c 'echo TEXT '$f1' TEXT > systemFile'

我已经在 .sh 文件中使用了这个功能强大的脚本行,它工作正常。

【讨论】:

    【解决方案2】:

    这也可以:

    sudo sh -c "echo 'TEXT $VARIABLE TEXT' > systemFile"
    

    但是,通常不建议不必要地以 sudo 运行命令。您似乎只希望重定向为“sudoed”。所以试试这些选项:

    echo "TEXT $VARIABLE TEXT" | sudo tee systemFile >/dev/null
    echo "TEXT $VARIABLE TEXT" | sudo dd of=systemFile
    

    echo 可以是简单的回显,或者您想要的任何其他命令。请注意,此命令不在sudo 下运行。

    【讨论】:

    • # 在 systemaFile 中写入我需要 sudo sh - 已在问题中提及
    • ^^ NO.试试sudo dd/sudo tee 选项。 sh 不需要使用 sudo
    • 检查此问题以获取其他选项:*.com/q/17396951#answers
    【解决方案3】:

    使用-E 选项运行sudo

    sudo -E sh -c 'echo "TEXT VARIABLE TEXT" > systemFile'
    

    来自man sudo

    -E

    -E(保留环境)选项向安全策略表明用户希望保留他们现有的环境变量。如果指定了 -E 选项并且用户没有保留环境的权限,则安全策略可能会返回错误。

    【讨论】:

      【解决方案4】:

      Shell 变量仅在“双引号”中展开,而不在“单引号”中。

      $ v=value
      
      $ echo $v
      value
      
      $ echo "$v"
      value
      
      $ echo '$v'
      $v
      

      您正在启动 sh 的新实例,然后运行命令 echo "TEXT $f1 TEXT" &gt; systemFile

      由于$f1尚未在新进程中分配,因此为空。


      要解决此问题,您可以扩展 $f1 并在命令行中传递:
      sudo sh -c 'echo "TEXT '$f1' TEXT" &gt; systemFile'

      或者将其导出,以便子进程可以使用(使用-E 保护环境,感谢 anishsane):
      export f1
      sudo -E sh -c 'echo "TEXT $f1 TEXT" &gt; systemFile'

      【讨论】:

      • sudo 似乎没有将exports 传递给它的孩子。导出时,没有 sudo 的相同命令可以正确打印。
      • 另外注意,'echo "TEXT '$f1' TEXT" 应该是'echo "TEXT '"$f1"' TEXT",以防$f1 包含空格或特殊字符。
      • @anishsane 啊,我忘了你需要-E 标志来保存环境变量。但是,不,没有额外的双引号对我来说可以正常工作。
      • 按照您的指示,我尝试过,结果如#f1 为空,为什么?
      最近更新 更多