echo gibt Parameter mit aus - aber warum?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
altmetaller
Beiträge: 133
Registriert: 03.02.2017 12:28:41

echo gibt Parameter mit aus - aber warum?

Beitrag von altmetaller » 30.04.2021 13:34:03

Huhu,

hier mal der Anfang aus "irgendeinem" Script:

Code: Alles auswählen

#!/bin/sh

LOG="/var/log/at_night.log"

echo -e "backup.sh wird gestartet\n" > $LOG
/root/scripte/backup.sh >> $LOG 2>&1
Mein Output sieht in etwa so aus:
-e backup.sh wird gestartet

# hier stehen die Textausgaben vom Script backup.sh
Jetzt stellt sich die Frage, warum das -e mit ausgegeben wird. Dieses Verhalten habe ich "nur" bei der /bin/sh, bei der /bin/bash funktioniert es fehlerfrei...?!? Warum das unterschiedliche Verhalten?

Gruß,
Jörg

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: echo gibt Parameter mit aus - aber warum?

Beitrag von heisenberg » 30.04.2021 13:39:10

Hast Du schon mal die Hilfe von dem echo Befehl/Builtin gelesen, den Du verwendest?

--> man sh

altmetaller
Beiträge: 133
Registriert: 03.02.2017 12:28:41

Re: echo gibt Parameter mit aus - aber warum?

Beitrag von altmetaller » 30.04.2021 13:41:14

Hallo,

nein - ich habe die Hilfe von "man echo" gelesen.

Also ist der echo-Befehl in der sh fest eingebaut, die bash ruft hingegen /usr/bin/echo auf?

Gruß,
Jörg

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: echo gibt Parameter mit aus - aber warum?

Beitrag von smutbert » 30.04.2021 13:44:07

Die bash verfügt afaik auch über ein eingebautes echo, aber das der »/bin/sh« bietet im Gegensatz dazu eben keine Option -e. Du könntest stattdessen die bash oder eine andere Shell verwenden oder gezielt das eigenständige Programm echo aufrufen:

Code: Alles auswählen

/usr/bin/echo -e "u. s. w."

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: echo gibt Parameter mit aus - aber warum?

Beitrag von Meillo » 30.04.2021 13:52:22

Hier dein Befehl und zwei (bessere) Alternativen:

Code: Alles auswählen

echo -e "backup.sh wird gestartet\n" > $LOG

{ echo "backup.sh wird gestartet"; echo; } > "$LOG"

printf "backup.sh wird gestartet\n\n" > "$LOG"


Vielleicht waere es sinnvoll, die komplette Ausgabe des Scripts umzuleiten. Dazu diese Zeile ins Script aufnehmen, dann wird die Ausgabe aller folgenden Befehle dorthin umgeleitet:

Code: Alles auswählen

exec >"$LOG" 2>&1
Die Umleitungen an den einzelnen Befehlen kannst du dir danach sparen.

Dann kannst du auch ganz bequem so deine Ausgaben machen:

Code: Alles auswählen

echo "backup.sh wird gestartet"
echo
Use ed once in a while!

altmetaller
Beiträge: 133
Registriert: 03.02.2017 12:28:41

Re: echo gibt Parameter mit aus - aber warum?

Beitrag von altmetaller » 30.04.2021 14:08:09

Hallo,
Meillo hat geschrieben: ↑ zum Beitrag ↑
30.04.2021 13:52:22
Vielleicht waere es sinnvoll, die komplette Ausgabe des Scripts umzuleiten. Dazu diese Zeile ins Script aufnehmen, dann wird die Ausgabe aller folgenden Befehle dorthin umgeleitet:

Code: Alles auswählen

exec >"$LOG" 2>&1
Japp, das ist tatsächlich "wesentlich eleganter". So weit bin ich gedanklich noch nicht, ich kämpfe gerade mit diversen IF-Statements :-)

Hier, so sieht das im Moment aus:

Code: Alles auswählen

#!/bin/bash

LOG="/var/log/at_night.log"
HOST=das_orange_ding

echo -e "backup.sh wird gestartet\n" > $LOG
/root/scripte/backup.sh >> $LOG 2>&1

echo -e "\n\n\n\n\nprune.sh wird gestartet\n" >> $LOG
/root/scripte/prune.sh >> $LOG 2>&1

if [ $(date +"%-d") = 1 ]
then
  echo -e "\n\n\n\n\check.sh wird gestartet\n" >> $LOG
  /root/scripte/check.sh >> $LOG 2>&1
else
  echo -e "\n\n\n\n\ncheck.sh wird nur am 1. Tag des Monats gestartet \n" >> $LOG
fi

if [ -f /tmp/wol_yes ]
then
  cat $LOG | mailx -s "$HOST WOL Start, Rechner wird heruntergefahren" meine@email.adresse
  rm /tmp/wol_yes
  sleep 60
  /usr/sbin/shutdown -h now
else
  cat $LOG | mailx -s "$HOST lief bereits und bleibt eingeschaltet" meine@email.adresse
fi
Die Datei /tmp/wol_yes existiert nur, wenn der Rechner per "WAKE on LAN" gestartet wurde. Das Verfahren habe ich hier beschrieben: https://www.altmetaller.de/linux-naecht ... ke-on-lan/

Und ja, ich weiß, dass ich für den Hostnamen auch die /etc/hostname auswerten kann... :-)

Gruß,
Jörg

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: echo gibt Parameter mit aus - aber warum?

Beitrag von heisenberg » 30.04.2021 14:15:59

Ich bastel mir das meistens so, dass ich die Ausgabe in eine Funktion auslagere. Damit kann ich dann einfach die Ausgaben nach Bedarf ein- und ausschalten:

Code: Alles auswählen

#!/bin/bash

export LOG_ENABLED=1
export LOG_FILE=$HOME/myprogram.log

# Zur Sicherheit, damit wirklich alle Ausgaben und Fehler im Log landen.
exec $0 2>$LOG_FILE >&2

mylog() {
    [ $LOG_ENABLED -eq 1 ] && echo "$(date) : $*" >$LOG_FILE
}

# So ruft man das auf
mylog "Programm startet'

# Das ist die Log-Ausgabe
Fr 30. Apr 14:15:40 CEST 2021 : Programm startet

altmetaller
Beiträge: 133
Registriert: 03.02.2017 12:28:41

Re: echo gibt Parameter mit aus - aber warum?

Beitrag von altmetaller » 30.04.2021 14:37:06

Hallo,

mich würde eher interessieren, was Du von der Vorgehensweise mit dem "Wake on LAN" Start hältst, den ich in meinem Blog beschrieben habe.

Da bin ich gerade ein bisschen stolz drauf. Zumal ich scripten hasse(!) und mich wirklich überwinden musste, das mal anzugehen :-)

Gruß,
Jörg

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: echo gibt Parameter mit aus - aber warum?

Beitrag von heisenberg » 30.04.2021 15:24:47

Nachdem WOL mit dem Thema Strom sparen zu tun hat, finde ich das grundsätzlich mal gut!

Antworten