Shell script, в то время как чтение строки цикла прекращается после первой строки

У меня есть следующий сценарий оболочки. Цель состоит в том, чтобы пройти через каждую строку целевого файла (путь которого является входным параметром сценария) и выполнить работу с каждой строкой. Теперь кажется, что он работает только с самой первой строкой в целевом файле и останавливается после обработки этой строки. Что-то не так с моим сценарием?

#!/bin/bash
# SCRIPT: do.sh
# PURPOSE: loop thru the targets 

FILENAME=$1
count=0

echo "proceed with $FILENAME"

while read LINE; do
   let count++
   echo "$count $LINE"
   sh ./do_work.sh $LINE
done < $FILENAME

echo "\ntotal $count targets"

В do_work.sh я запускаю пару команд ssh.

Ответ 1

Проблема заключается в том, что do_work.sh запускает команды ssh и по умолчанию ssh считывает из stdin, который является вашим входным файлом. В результате вы видите только обработанную первую строку, потому что ssh потребляет оставшуюся часть файла, а цикл while завершается.

Чтобы предотвратить это, передайте параметр -n в свою команду ssh, чтобы прочитать его с /dev/null вместо stdin.

Ответ 2

Параметр ssh -n предотвращает проверку состояния выхода ssh при использовании HEREdoc во время вывода конвейера в другую программу. Поэтому использование /dev/null в качестве stdin является предпочтительным.

#!/bin/bash
while read ONELINE ; do
   ssh [email protected]_xyz </dev/null <<EOF 2>&1 | filter_pgm 
   echo "Hi, $ONELINE. You come here often?"
   process_response_pgm 
EOF
   if [ ${PIPESTATUS[0]} -ne 0 ] ; then
      echo "aborting loop"
      exit ${PIPESTATUS[0]}
   fi
done << input_list.txt

Ответ 3

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

while read -r LINE; do
   let count++
   echo "$count $LINE"
   sh ./do_work.sh "$LINE" </dev/null
done < "$FILENAME"

Ключевым моментом здесь является добавление </dev/null (хотя исправленные кавычки также несколько важны; см. Также " Когда оборачивать кавычки вокруг переменной оболочки?"). Вы захотите использовать read -r если только вам не требуется устаревшее слегка странное поведение, которое вы получаете без -r.

Другой обходной путь, который несколько специфичен для ssh - это убедиться, что любая команда ssh имеет стандартный ввод, например, путем изменения

ssh otherhost some commands here

вместо этого читать команды из документа здесь, который удобно (для этого конкретного сценария) связывает стандартный ввод ssh для команд:

ssh otherhost <<'____HERE'
    some commands here
____HERE

Ответ 4

Используйте ssh -n ... для запуска ваших удаленных команд через ssh.

Ответ 5

#! /bin/bash
cat /root/host.txt | while read LINE
..
..

использовать ssh -n -o StrictHostKeychecking=no в do_work.sh script

  • Элемент списка