gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:31:56 25 4
gpt4 key购买 nike

这个问题与这个问题类似: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

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

在回答时,请您避免这样的问题/评论:

  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

最佳答案

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

关于Bash 脚本被打印而不是被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26224472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com