Bash脚本被打印而不是被执行

时间:2014-10-06 20:36:46

标签: bash shell unix sh apt

这个问题类似于这个问题:https://serverfault.com/questions/342697/prevent-sudo-apt-get-etc-from-swallowing-pasted-input-to-stdin但答案并不令人满意(将&&附加到每行bash脚本并不优雅)并且没有解释为什么某些用户可以粘贴/执行多个后续apt-get install -y命令和其他命令,因为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更改为shdash),我会得到预期的行为:

cat my_script.sh | sudo -i sh

你能解释为什么会发生这种情况吗?

回答时,请您避免这些问题/评论:

  1. 你为什么这样做?
  2. 管道到你的bash是不安全的
  3. 其他一些方面不安全或不善
  4. 我只是想知道为什么bash没有像我期望的那样工作,sh会这样做。

    PS。我正在使用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
    

1 个答案:

答案 0 :(得分:1)

使用-i标志时,Bash和dash只是表现不同。 即使stdin不是终端,Bash也总是进入交互模式。 另一方面,即使使用-i标志,Dash也不会进入交互模式。