4

Это мой скрипт test.sh

if ssh myhost true; then
  echo 1
fi
echo 2

п.с. Я установил ключ ssh для myhost, поэтому он не будет спрашивать пароль.

Если я запусту его через bash, он выведет две строки

$ bash test.sh
1
2

Однако, если я перенаправлю скрипт на стандартный bash, он выведет только одну строку

$ bash < test.sh
1

Почему Баш ведет себя по-другому? Это ошибка bash или магическая функция?

Я пробовал Bash 4.3 и 4.4.

п.с. Если я заменю ssh myhost true на true , скрипт всегда выведет две строки.

1 ответ1

3

Короткий ответ: есть важное различие между наличием команд чтения bash из файла и получением bash всего ввода из файла.

ssh обычно читает все доступные данные со стандартного входа и отправляет их через соединение на удаленный компьютер. Когда вы запускаете bash test.sh , оболочка читает команды из test.sh, но стандартный ввод остается вашим терминалом; ssh отправит все, что вы ввели, true команде (которая будет игнорировать ее). Когда вы запускаете bash < test.sh , для сценария устанавливается стандартный ввод, поэтому и bash, и команды, которые он запускает, читают из него. bash читает блок if , затем выполняет его; ssh читает оставшуюся часть сценария (команда echo 2 ) и отправляет его на удаленное значение true , которое игнорирует его. Затем bash обнаруживает, что он находится в конце своего ввода, поэтому он завершает работу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .