Странное поведение при копировании / вставке команд 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, он получает от него информацию, поэтому не читает реальный стандарт с помощью команд.