Zajímavost v bash: find | head

Zajímavost v bash: find | head
« kdy: 25. 05. 2021, 18:08:07 »
Byl jsem překvapen a stálo mne to nějaký čas:

#!/bin/bash
set -o pipefail
trap '>&2 echo Chyba v $0 na řádku $LINENO: $(sed -n ${LINENO}p $0)' ERR

find . | sed -n '1p' && echo ok || echo error
find . | head -1 && echo ok || echo error
find . | head -1

Vysvětlení je například zde:
http://www.greenend.org.uk/rjk/tech/shellmistakes.html#pipeerrors


_Jenda

  • *****
  • 901
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Zajímavost v bash: find | head
« Odpověď #1 kdy: 25. 05. 2021, 19:20:17 »
A řeší se to pomocí mispipe z balíku moreutils.

Re:Zajímavost v bash: find | head
« Odpověď #2 kdy: 28. 05. 2021, 18:36:16 »
Pokud by roura byla delší než dva členy, tak by to asi šlo řešit i takto:
#!/bin/bash
set -o pipefail
(( for (( I=0;  I < 4000; I++ )); do echo "a"; done) || [[ $? -eq 141 ]]) \
   | ( sed 's/a/b/g' || [[ $? -eq 141 ]] ) \
   | ( sed 's/b/c/g' || [[ $? -eq 141 ]] ) \
   | sed '1q' || echo ${PIPESTATUS
  • }