【问题标题】:Bash script gets printed instead of being executedBash 脚本被打印而不是被执行
【发布时间】:2014-10-06 20:36:46
【问题描述】:

这个问题与这个问题类似:https://serverfault.com/questions/342697/prevent-sudo-apt-get-etc-from-swallowing-pasted-input-to-stdin 但答案并不令人满意(将&& 附加到bash 脚本的每一行并不优雅)并且没有解释为什么有些用户可以粘贴/执行多个后续@987654323 @ 命令和其他命令不能,因为 stdout 被下一个命令膨胀了。

我有一个脚本my_script.sh:

sudo apt-get install -y graphicsmagick
sudo apt-get install -y libgraphicsmagick++1-dev
...

它只能有两行或更多的sudo apt-get install 内容。库(graphicsmagick 等)无关紧要,可以是任何库。

当我复制这个脚本并将其内容粘贴到 bash 或像这样执行它时:

cat my_script.sh | sudo -i bash

然后由于某种原因,只有第一行(graphicsmagick)被执行,其余的只是打印到控制台。仅在sudo apt-get install -y 发生,其他不包含此命令的脚本正常运行。

如果我将bash 更改为sh(即dash),我会得到预期的行为:

cat my_script.sh | sudo -i sh

您能解释一下为什么会发生这种情况吗?

在回答的时候,请你避开这个问题/cmets:

  1. 你为什么要这样做?
  2. 通过管道连接到 bash 并不安全
  3. 其他一些方面不安全或不安全

我只是想知道为什么bash 不能像我预期的那样工作,而sh 却可以。

附言。我使用的是 Ubuntu 14.04,sh 是破折号,你可以在这里看到:

vagrant@vagrant-ubuntu-trusty-64:/tmp$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 19  2014 /bin/sh -> dash

【问题讨论】:

  • 你怎么知道shdashls -l /bin/sh 应该告诉你。您使用的是什么操作系统?
  • @KeithThompson - 是的,它是 dash,ubuntu 14.04,quiestion 已编辑。
  • 可能与您的问题无关,但您不需要在脚本中和调用bashsh 时都使用sudo
  • @KeithThompson - 同意,但它会导致任何问题吗?
  • 这可以被简化为一个脚本文件sudo apt-get -y install graphicsmagick<NEWLINE>sudo apt-get -y install libgraphicsmagick++1-dev,由cat tmp.sh | bashcat tmp.sh | dash 以不同的方式执行。这就是 minimal 示例的意义所在,并且不需要人们通过 sudo 执行下载的脚本或自己减少问题。在 Mint 17 上验证了这一点;似乎bash 以某种方式将stdin 的其余部分提供给apt-get 之前 -y 选项启动。奇怪...

标签: bash shell unix sh apt


【解决方案1】:

使用 -i 标志时,Bash 和 dash 的行为不同。 即使标准输入不是终端,Bash 也总是进入交互模式。 另一方面,即使使用 -i 标志,Dash 也不会进入交互模式。

【讨论】:

    【解决方案2】:

    可能需要-s 选项

    如果存在-s 选项,或者选项后没有剩余参数 处理,然后从标准输入中读取命令。该选项允许 调用交互式 shell 时要设置的位置参数。

    Bash man page

    curl -s http://foo.com/bar.sh | sudo -i bash -s
    

    Example

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      相关资源
      最近更新 更多