Ik ben aan het experimenteren met pipes in bash.
Ik laat het "shuf" commando random getallen genereren tussen 100000 en 999999 en dankzij de --repeat optie kan hij daar oneindig lang mee doorgaan. Door middel van het "timeout" commando stop ik hem 2 seconden later. De resulterende lijst van random getallen wil ik daarna in een pipe sorteren.
Dat ziet er dan zo uit:
Je ziet dat dit niet helemaal goed werkt: timeout stopt shuf wel na 2 seconden, maar dan verschijnt het woord "Terminated" en ik krijg verder niets te zien van de gegenereerde lijst getallen. De pipe is afgebroken.
Er zijn verschillende settings die te maken hebben met foutmeldingen en pipes in bash (bijvoorbeeld: set -o pipefail), maar die maken geen verschil. Je kunt timeout het signaal "HUP" laten sturen, maar dit geeft hetzelfde resultaat (maar dan met de melding Hangup in plaats van Timeout).
Gek genoeg werkt het zo wel:
Maar hoe kan het precies dat deze kleine aanpassing het afbreken van de pipe voorkomt?
Ik gebruik Linux Mint 21.1 en bash versie: 5.1.16(1)-release (x86_64-pc-linux-gnu)
Ik laat het "shuf" commando random getallen genereren tussen 100000 en 999999 en dankzij de --repeat optie kan hij daar oneindig lang mee doorgaan. Door middel van het "timeout" commando stop ik hem 2 seconden later. De resulterende lijst van random getallen wil ik daarna in een pipe sorteren.
Dat ziet er dan zo uit:
Bash:
1
2
3
| $ ( timeout --verbose 2 shuf -i 100000-999999 --repeat ) | sort | head timeout: sending signal TERM to command ‘shuf’ Terminated |
Je ziet dat dit niet helemaal goed werkt: timeout stopt shuf wel na 2 seconden, maar dan verschijnt het woord "Terminated" en ik krijg verder niets te zien van de gegenereerde lijst getallen. De pipe is afgebroken.
Er zijn verschillende settings die te maken hebben met foutmeldingen en pipes in bash (bijvoorbeeld: set -o pipefail), maar die maken geen verschil. Je kunt timeout het signaal "HUP" laten sturen, maar dit geeft hetzelfde resultaat (maar dan met de melding Hangup in plaats van Timeout).
Gek genoeg werkt het zo wel:
Bash:
1
2
3
4
5
6
7
8
9
10
11
12
| $ ( timeout --verbose 2 shuf -i 100000-999999 --repeat ; false ) | sort | head timeout: sending signal TERM to command ‘shuf’ 100000 100000 100001 100002 100002 100003 100003 100003 100003 100004 |
Maar hoe kan het precies dat deze kleine aanpassing het afbreken van de pipe voorkomt?
Ik gebruik Linux Mint 21.1 en bash versie: 5.1.16(1)-release (x86_64-pc-linux-gnu)
[ Voor 28% gewijzigd door aawe mwan op 03-06-2023 13:37 ]
„Ik kan ook ICT, want heel moeilijk is dit niet”