【问题标题】:Why would one run cat|bash before copying/pasting into a terminal?为什么要在复制/粘贴到终端之前运行 cat|bash ?
【发布时间】:2020-05-11 01:24:53
【问题描述】:

我看到有人在将剪贴板中的命令粘贴到终端之前运行 cat|bash

bash 在 bash 中执行命令 我不知道为什么我们这里需要cat|(pipe)

这种做法有什么有用的效果?

【问题讨论】:

  • ...一般来说,在断言 stdin 不是 TTY 的同时,还有其他/更好的方法可以将输入输入到 stdin 上的 shell。 bash <<'EOF' 将完成这项工作,f/e。不需要cat——因为heredoc 是作为文件呈现的,而不是TTY。 curl | bashbash < inputfile 或我能想到的几乎任何其他有用的案例也是如此。
  • @CharlesDuffy 感谢您的命令,是我的同事在终端中执行了一堆命令,如果直接复制并粘贴到终端中,它将被执行但他在粘贴之前做了cat|bash那些命令集。
  • 这清楚地说明了这个问题!就我个人而言,我会改为运行 bash <<'EOF",然后在粘贴后键入 EOF,但这些方法通常可以完成相同的事情。

标签: bash shell terminal scripting


【解决方案1】:

是我的同事在终端中执行了一堆命令,[...] 他在粘贴这些命令集之前执行了cat|bash

这可能会阻止 Bash 将命令中的任何内容解释为编辑输入,覆盖他设置的任何特殊键绑定和别名,和/或阻止命令将命令流用作输入。

考虑这个带有两个嵌入制表符的命令:

    if true
    then
        echo "yup"
    fi

将其粘贴到 shell 时会发生以下情况(因为制表符会在交互式输入中触发制表符完成):

$ if true
> then
>
Display all 2600 possibilities? (y or n)
!                                   grub-mkfont                         pnmmontage
./                                  grub-mkimage                        pnmnlfilt
:                                   grub-mklayout                       pnmnoraw

这是一个涉及ssh的sn-p:

ssh localhost uptime
echo "Finished"

当您将其粘贴到 shell 中时,第二个命令会被 ssh 用作输入,因此您会得到:

$ ssh localhost uptime
 09:53:40 up 28 days, 18:33, 25 users,  load average: 0.06, 0.01, 0.00

在这两种情况下,粘贴到 cat | bash 会导致命令按原样运行。

【讨论】:

    【解决方案2】:

    这会从终端读取命令并在bash 中执行它们。它类似于单独运行bash,除了当 bash 的标准输入是终端时,它默认以交互方式运行——它显示提示、执行输入编辑、启用别名、执行作业控制等。这将以非交互方式运行,所以它只会像在脚本中一样执行命令。

    我不确定为什么有人会想要这样做。

    【讨论】:

    • 感谢@Barman 的回答。我能看到的原因之一是。只需复制粘贴命令集即可存储在 history 中,但执行 cat|bash 不会将该命令存储到历史记录中,也不会默认切换 shell (zsh) 到 bash on bash 命令
    【解决方案3】:

    除了这里给出的其他好的答案(tab 补全,ssh/ptty),cat|bash 不会让粘贴的命令改变 当前 shell 的环境。

    例如,如果复制粘贴的命令是:

    PATH=/some/place/odd:$PATH
    somecommand some args
    

    cat|bash中的shell在运行somecommand后退出后PATH不变。

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 2011-10-06
      • 2022-11-21
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多