首页 > 解决方案 > Bash 将标准输入重定向为标准输入

问题描述

在我的脚本中,有时我需要将脚本传递给 SSH,有时还需要让用户进行交互。

我试过这个技巧:

if [ "" != "$SSH_SCRIPT" ] ; then
  ...
else
  SSH_SCRIPT="&0";
fi

接着:

ssh $SSH_IGNORE_STDIN $SSH_TTY $noKeyCheck -i $AWS_KEY $USER_@$HOST_ "$COMMAND_SSH" <$SSH_SCRIPT;

我认为这是可行的,因为可行cat <&0

但是当我在 之后使用变量时<,它的工作方式不同 - 它抱怨&0找不到文件。看起来像是<&n一个语法结构。可以这样重现:

$ FOO='&0';
$ cat <$FOO
bash: &0: No such file or directory

有没有办法通过文件描述符编号参数化重定向?

将整个命令封闭起来bash -c "..."可能不是一个好主意,因为它会使整个事情变得更加复杂。
将命令上传到远程服务器并在那里运行它也有点矫枉过正。

到目前为止,我已经诉诸:

    if [ "" == "$SSH_SCRIPT" ] ; then
        ssh $SSH_IGNORE_STDIN $SSH_TTY $noKeyCheck -i $AWS_KEY $USER_@$HOST_ "$COMMAND_SSH";
    else
        ssh $SSH_IGNORE_STDIN $SSH_TTY $noKeyCheck -i $AWS_KEY $USER_@$HOST_ "$COMMAND_SSH" <$SSH_SCRIPT;
    fi

标签: bashstdinfile-descriptorio-redirection

解决方案


bash无论您的文件系统是否公开此类文件,都会将其识别/dev/stdin为重定向的参数。

if [ -z "$SSH_SCRIPT" ]; then
    SSH_SCRIPT=/dev/stdin
fi

ssh ... < "$SSH_SCRIPT"

推荐阅读