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