Skip to content

Files

Latest commit

 

History

History
35 lines (23 loc) · 947 Bytes

SC2095.md

File metadata and controls

35 lines (23 loc) · 947 Bytes

Pattern: Bash command swallowing stdin

Issue: -

Description

Commands that process stdin will compete with the read statement for input. This is especially tricky for commands you wouldn't expect reads from stdin, like ssh .. uptime, ffmpeg and mplayer.

The most common symptom of this is a while read loop only running once, even though the input contains many lines. This is because the rest of the lines are swallowed by the offending command.

To refuse such commands input, redirect their stdin with < /dev/null.

You can also use command specific options like ssh -n and mplayer -noconsolecontrols.

Example of incorrect code:

while read -r host
do
  ssh "$host" "uptime"
done < hosts.txt

Example of correct code:

while read -r host
do
  ssh "$host" "uptime" < /dev/null
done < hosts.txt

Further Reading