将带有herdocs的bash命令复制/粘贴到终端时的奇怪行为

将带有herdocs的bash命令复制/粘贴到终端时的奇怪行为,bash,heredoc,Bash,Heredoc,为了简化一些过程,我记录了一大系列的终端命令,以便在需要时复制和粘贴它们 然而,我遇到了一些奇怪的行为,如下所示: ssh $USER@$SERVER 'rm ~/backup.tar' tar -xvzf backup.tar cd backup 当我复制所有这些内容并将其粘贴到终端时,SSH命令被执行,导致运行时暂停。一旦完成,就不会执行tar和cd命令,就好像从未复制过一样 我猜测这是因为在SSH命令仍在执行时,它们不知何故被“键入”(我知道这不是正确的词),因此被该命令消耗——在那里

为了简化一些过程,我记录了一大系列的终端命令,以便在需要时复制和粘贴它们

然而,我遇到了一些奇怪的行为,如下所示:

ssh $USER@$SERVER 'rm ~/backup.tar'

tar -xvzf backup.tar
cd backup
当我复制所有这些内容并将其粘贴到终端时,SSH命令被执行,导致运行时暂停。一旦完成,就不会执行
tar
cd
命令,就好像从未复制过一样

我猜测这是因为在SSH命令仍在执行时,它们不知何故被“键入”(我知道这不是正确的词),因此被该命令消耗——在那里什么也不做

当然,这是有道理的,但这里有点奇怪:

ssh $USER@$SERVER 'rm ~/backup.tar' <<EOF
EOF

tar -xvzf backup.tar
cd backup

ssh$USER@$SERVER'rm~/backup.tar'
ssh
读取标准输入。如果您提供一个HERE doc,它将从中获取输入,因此不会使用命令读取真正的stdin。

在第一个示例中,
tar
cd
命令转到ssh的stdin。第二次,ssh的stdin被终止,因此bash被执行
tar
cd
当您正常运行命令时,进程的标准输入连接到终端。终端程序接收到的任何字符都会传递给进程。但是,当您运行带有重定向的命令时,就像您使用的herdeoc一样,进程的标准输入连接到包含herdeoc内容的内存缓冲区。在这种情况下,终端程序接收的字符不会传递给进程;取而代之的是,它们被保存下来,在这个过程结束后,终端程序会决定如何处理它们

至于如何修复:最好的方法可能是使用shell脚本,而不是复制和粘贴。但是,如果由于某种原因不能做到这一点,重定向似乎是一个合理的解决方案。您可以直接运行,而不是提供一个heredoc

ssh $USER@$SERVER 'rm ~/backup.tar' </dev/null

ssh$USER@$SERVER'rm~/backup.tar'为什么我们认为我们要提供这些输入?在命令行中,ssh根本不应该查看输入。
ssh
命令在命令完成之前不会返回,这不是输入问题。