Vraag echo die naar stderr wordt uitgevoerd


Is er een standaard Bash-tool die werkt als echo maar als output naar stderr in plaats van stdout?

Ik weet dat ik het kan echo foo 1>&2 maar het is een beetje lelijk en, naar ik vermoed, foutgevoelig (het is bijvoorbeeld waarschijnlijker dat fouten worden gemaakt als dingen veranderen).


785
2018-06-07 14:36


oorsprong


antwoorden:


Deze vraag is oud, maar je zou dit kunnen doen, wat het lezen vergemakkelijkt:

>&2 echo "error"

De operator >&2 betekent letterlijk het omleiden van het adres van bestandsdescriptor 1 (stdout) naar het adres van bestandsdescriptor 2 (stderr) voor die opdracht1. Afhankelijk van hoe diep je het wilt begrijpen, lees dit: http://wiki.bash-hackers.org/howto/redirection_tutorial

Gebruik subshell om interactie met andere omleidingen te voorkomen

(>&2 echo "error")

1>&2 kopieert bestandsbeschrijving # 2 naar bestandsbeschrijving # 1. Daarom, nadat deze omleiding is uitgevoerd, verwijzen beide bestandsdescriptoren naar hetzelfde bestand: de ene bestandsbeschrijving # 2 was oorspronkelijk verwijzend naar.


977
2018-05-08 18:59



U zou een functie kunnen definiëren:

echoerr() { echo "$@" 1>&2; }
echoerr hello world

Dit zou sneller zijn dan een script en geen afhankelijkheden hebben.

De bash-specifieke suggestie van Camilo Martin gebruikt een "here string" en zal alles afdrukken wat je er aan doorgeeft, inclusief argumenten (-n) die echo normaal zou inslikken:

echoerr() { cat <<< "$@" 1>&2; }

De oplossing van Glenn Jackman vermijdt ook het probleem van het slikken van argumenten:

echoerr() { printf "%s\n" "$*" >&2; }

355
2018-06-07 14:52



Sinds 1 is de standaarduitvoer, je hoeft het niet expliciet te benoemen voor een output-omleiding zoals > maar in plaats daarvan kan gewoon typen:

echo Dit bericht gaat naar stderr> & 2

Omdat je je daar zorgen over maakt 1>&2 zal moeilijk zijn voor jou om betrouwbaar te typen, de eliminatie van de overtollige 1 misschien een kleine aanmoediging voor jou!


202
2017-07-10 21:24



Andere optie

echo foo >>/dev/stderr

39
2018-01-16 03:57



Nee, dat is de standaardmanier om het te doen. Het mag geen fouten veroorzaken.


29
2018-06-07 14:37



Dit is een eenvoudige STDERR-functie, die de invoer van de buis naar STDERR leidt.

#!/bin/bash
# *************************************************************
# This function redirect the pipe input to STDERR.
#
# @param stream
# @return string
#
function STDERR () {

cat - 1>&2

}

# remove the directory /bubu
if rm /bubu 2>/dev/null; then
    echo "Bubu is gone."
else
    echo "Has anyone seen Bubu?" | STDERR
fi


# run the bubu.sh and redirect you output
tux@earth:~$ ./bubu.sh >/tmp/bubu.log 2>/tmp/bubu.err

12
2018-02-03 08:40



Als je het niet erg vindt om het bericht ook naar syslog te loggen, is de not_so_ugly manier:

logger -s $msg

De optie -s betekent: "Voer het bericht uit naar de standaardfout en naar het systeemlogboek."


9
2017-08-04 19:15