2014-10-06 88 views
3

這個問題是類似於這個:https://serverfault.com/questions/342697/prevent-sudo-apt-get-etc-from-swallowing-pasted-input-to-stdin但答案並不令人滿意(追加&&每行的bash腳本不雅),並不能解釋爲什麼一些用戶可以粘貼/執行多個後續的apt-get install -y命令,而其他的不能,因爲標準輸出由下一個命令引起。Bash腳本得到打印,而不是被執行

我有一個腳本my_script.sh

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

它只能有兩行以上的sudo apt-get install東西。這些庫(graphicsmagick等)無關緊要,它可以是任何庫。

當我複製此腳本並粘貼它的內容打壞或只是執行它是這樣的:

cat my_script.sh | sudo -i bash 

然後由於某種原因,只有第一線(實:graphicsmagick)得到執行,剩下的只是打印到安慰。它只發生在sudo apt-get install -y,其他腳本不包含此命令行爲正常。

如果我改變bashsh(這是dash)我得到預期的行爲:

cat my_script.sh | sudo -i sh 

你能解釋一下爲什麼發生?

回答時,可以請你避免這個問題/評論:

  1. 你爲什麼做這種方式?
  2. 管道到你的bash是不是安全
  3. 其他一些方面是不是安全或hackish的

我只是想知道爲什麼bash不工作,我期望和sh一樣。

PS。我使用Ubuntu 14.04,SH是破折號,你可以在這裏看到:

[email protected]:/tmp$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 Feb 19 2014 /bin/sh -> dash 
+0

你怎麼知道'sh'是'dash'? 'ls -l/bin/sh'應該告訴你。你在使用什麼操作系統? – 2014-10-06 21:50:05

+0

@KeithThompson - 是的,它的破折號,ubuntu 14.04,quiestion編輯。 – mnowotka 2014-10-06 22:12:05

+0

可能與您的問題無關,但您不需要在腳本中以及調用'bash'或'sh'時使用'sudo'。 – 2014-10-06 22:19:19

回答

1

Bash和使用-i標誌時,儀表板簡單地表現不同。 即使標準輸入不是終端,Bash也會進入交互模式。 另一方面,短劃線不會進入交互模式,即使使用-i標誌。