这个问题类似于这个问题: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
更改为sh
(dash
),我会得到预期的行为:
cat my_script.sh | sudo -i sh
你能解释为什么会发生这种情况吗?
回答时,请您避免这些问题/评论:
我只是想知道为什么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
答案 0 :(得分:1)
使用-i标志时,Bash和dash只是表现不同。 即使stdin不是终端,Bash也总是进入交互模式。 另一方面,即使使用-i标志,Dash也不会进入交互模式。