8

I often see questions which are essentially the same as...


My while loop only iterates once when I call ssh in the body of the loop.

while read -r line; do
    ssh somehost "command $line"
done < argument_list.txt

0

1 Answer 1

8

ssh also reads from standard input, so the first call to ssh consumes the rest of argument_list.txt before the next call to read. To fix, either redirect ssh's standard input from /dev/null using either

ssh somehost "command $line" < /dev/stdin

or

ssh -n somehost "command $line"

In the event that ssh really does need to read from standard input, you don't want it reading more data from argument_list.txt. In this case, you need to use a different file descriptor for the while loop.

while read -r line <&3; do
    ssh somehost "command $line"
done 3< argument_list.txt

bash and some other shells also allow read to take a -u option to specify the file descriptor, which some might find more readable.

while read -r -u 3 line; do
    ssh somehost "command $line"
done 3< argument_list.txt
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.