Странное поведение при копировании / вставке команд bash с heredocs в терминал

Чтобы упростить некоторые процессы, я задокументировал большую серию команд терминала, чтобы при необходимости их можно было копировать и вставлять.

Однако я сталкиваюсь со странным поведением, как показано здесь:

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

Это похоже на то же самое, но с каким-то случайным, бесцельным наследственником. Однако, когда у меня это есть, tar а также cd Команды успешно вставляются и выполняются после завершения команды SSH.

И так мой вопрос:

Какая разница, что сделал heredoc, что вызвало tar а также cd быть вставленным так, как я бы изначально ожидал?

Есть ли лучший способ, чем случайный удар по heredoc для достижения того же результата?

3 ответа

Решение

Когда вы запускаете команду в обычном режиме, стандартный ввод процесса подключается к терминалу. Любые символы, которые получает терминальная программа, передаются процессу. Но когда вы запускаете команду с перенаправлением, таким как используемый вами heredoc, стандартный ввод процесса подключается к буферу памяти, содержащему содержимое heredoc. В этом случае символы, которые получает терминальная программа, не передаются процессу; вместо этого они сохраняются, и после завершения процесса терминальная программа выясняет, что с ними делать.

Что касается того, как это исправить: возможно, лучше всего использовать сценарий оболочки вместо копирования и вставки. Но если вы не можете сделать это по какой-то причине, перенаправление кажется разумным решением. Вместо предоставления heredoc вы могли бы просто запустить

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

В первом примере tar а также cd команда пошла в стандартный ssh. Во втором stdin ssh был прерван и, следовательно, bash выполняется tar а также cd

ssh читает стандартный ввод. Если вы предоставляете документ HERE, он получает от него информацию, поэтому не читает реальный стандарт с помощью команд.

Другие вопросы по тегам