Перенаправление Bash в качестве стандартного ввода - PullRequest
0 голосов
/ 01 мая 2018

В моем сценарии иногда требуется передать сценарий в 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 голосов
/ 01 мая 2018

bash распознает /dev/stdin в качестве аргумента для перенаправления, независимо от того, предоставляет ли ваша файловая система такой файл.

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

ssh ... < "$SSH_SCRIPT"
...