Bash将stdin重定向为标准输入

时间:2018-05-01 15:00:05

标签: bash stdin file-descriptor io-redirection

在我的脚本中,有时我需要将脚本传递给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

1 个答案:

答案 0 :(得分:2)

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

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

ssh ... < "$SSH_SCRIPT"