App installieren
How to install the app on iOS
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Bash: if und grep
- Ersteller ghostadmin
- Erstellt am
ghostadmin
Grand Admiral Special
Das stimmt zwar, aber schau mal genau hin, was du als Referenz mit -d reingibst: nur die Tagesangabe. Und das führt zu Mitternacht. Probier's einfach mal aus ohne das +%s.
Macht ja auch nichts weil ich beide Male nur mit dem Datum ohne Uhrzeit verglichen hatte. Die Sekunden haben dann halt nur Tagessprünge aber deswegen stimmt das Endergebnis (Tage) trotzdem.
tomturbo
Technische Administration, Dinosaurier
- Mitglied seit
- 30.11.2005
- Beiträge
- 9.455
- Renomée
- 665
- Standort
- Österreich
- Aktuelle Projekte
- Universe@HOME, Asteroids@HOME
- Lieblingsprojekt
- SETI@HOME
- Meine Systeme
- Xeon E3-1245V6; Raspberry Pi 4; Ryzen 1700X; EPIC 7351
- BOINC-Statistiken
- Mein Laptop
- Microsoft Surface Pro 4
- Prozessor
- R7 5800X
- Mainboard
- Asus ROG STRIX B550-A GAMING
- Kühlung
- Alpenfön Ben Nevis Rev B
- Speicher
- 2x32GB Mushkin, D464GB 3200-22 Essentials
- Grafikprozessor
- Sapphire Radeon RX 460 2GB
- Display
- BenQ PD3220U, 31.5" 4K
- SSD
- 1x HP SSD EX950 1TB, 1x SAMSUNG SSD 830 Series 256 GB, 1x Crucial_CT256MX100SSD1
- HDD
- Toshiba X300 5TB
- Optisches Laufwerk
- Samsung Brenner
- Soundkarte
- onboard
- Gehäuse
- Fractal Design Define R4
- Netzteil
- XFX 550W
- Tastatur
- Trust ASTA mechanical
- Maus
- irgend eine silent Maus
- Betriebssystem
- Arch Linux, Windows VM
- Webbrowser
- Firefox + Chromium + Konqueror
- Internetanbindung
-
▼300
▲50
Wie man hier im Thread gut sieht, ist Bash zwar eine nette Shell, jedoch zum Programmieren eher nicht so ganz geeignet.
Die ganzen unklaren Reaktionen sind nicht mein Fall. In der nächsten Bash version reagiert das Skript vielleicht ganz anders.
Das wär mir zu unsicher.
In Perl oder meinetwegen in Python wäre das Skript keine große Sache gewesen.
Die ganzen unklaren Reaktionen sind nicht mein Fall. In der nächsten Bash version reagiert das Skript vielleicht ganz anders.
Das wär mir zu unsicher.
In Perl oder meinetwegen in Python wäre das Skript keine große Sache gewesen.
tspoon
Grand Admiral Special
- Mitglied seit
- 23.04.2006
- Beiträge
- 2.727
- Renomée
- 196
- Standort
- Dresden
- Aktuelle Projekte
- was so anliegt
- Lieblingsprojekt
- WCG FightAIDS@Home
- Meine Systeme
- 2x Intel Xeon E5645 @ 2,4Ghz (Phobya UC-2 LT + 360 MagiCool Magicool G2)
- BOINC-Statistiken
- Prozessor
- Intel i7 4770K
- Mainboard
- Asus Maximus VI Gene 1150
- Kühlung
- XSPC RayStorm Wasserkühler
- Speicher
- 4 x 4GB Patriot Viper Extrem 2133
- Grafikprozessor
- 2 x AMD 290X Crossfire (Watercool HK GPU-X³)
- Display
- 3x27" Samsung S27D590 Curved
- SSD
- ADATA SP900NS34 m,2, 240GB Corsair Force 3
- HDD
- 1 TB WD Green
- Optisches Laufwerk
- LG USB-DVD-Brennder
- Gehäuse
- Xigmatek Aquila Window
- Netzteil
- Coolermaster Silent Pro 1000Watt (Singlerail)
- Betriebssystem
- Windows 8.1
- Webbrowser
- Chrome
- Verschiedenes
- T500Rs + TH8RS
- Schau Dir das System auf sysprofile.de an
der IFS (Array-Wert-Trenner) ist immer "LEERSTELLE" . Diesen könnte man auch ändern allerdings muss man diesen dann wieder zurücksetzen etc was nervt.
zu deiner Zeile fügt da einfach am ende jedes wertes ein leerzeichen ein:
das echo was du da machst ist auch falsch ein Array immer mit $(snapshotdate
[*]) angeben. $snapshotdate gibt imemr den letzten wert aus.
der * steht für alle kann aber 0-9999 die jeweiligen array wert ausgeben. $(snapshotdate[0]) = 1 wert des array
Mein Vorschlag für nen Löschscript mit Zeit löscht alles älter als $DELETE_DAYS
zu deiner Zeile fügt da einfach am ende jedes wertes ein leerzeichen ein:
Code:
for snapshot in "$zfssnaplist"; do
$snapshotndate=$(echo "$snapshot" | awk '{ print $4 "-" $3 "-" $6" " }' | tr -d '\n')
echo "snap: $snapshotdate\n"
das echo was du da machst ist auch falsch ein Array immer mit $(snapshotdate
[*]) angeben. $snapshotdate gibt imemr den letzten wert aus.
der * steht für alle kann aber 0-9999 die jeweiligen array wert ausgeben. $(snapshotdate[0]) = 1 wert des array
Mein Vorschlag für nen Löschscript mit Zeit löscht alles älter als $DELETE_DAYS
Code:
#!/bin/sh
LC_ALL=C
DELETE_DAYS=2
SECONDS_PER_DAY=86400
TIMESTAMP=`date +%s`
DELETE_OLD_TIME=$(( $TIMESTAMP - $DELETE_DAYS * $SECONDS_PER_DAY ))
echo "Löschzeit $DELETE_OLD_TIME"
zfs list -H -t snapshot -o name,creation -s creation | while read snapshotname wochentag monat tag uhrzeit jahr ;do
echo -en "Name: $snapshotname ### Tag: $tag.$monat.$jahr ### Wochentag: $wochentag ### Datum-Timestamp: `date --d "$tag-$monat-$jahr $uhrzeit" +%s`"
if [ `date --d "$tag-$monat-$jahr $uhrzeit" +%s` -lt $DELETE_OLD_TIME ];then
echo " ### Delete $snapshotname"
else
echo ""
fi
done
Zuletzt bearbeitet:
ghostadmin
Grand Admiral Special
Ich bin mittlerweile schon etwas weiter als das
Code:
# clean old zfs snapshots according to keep interval
echo "### Start cleanup of ZFS snapshots ###"
# put . in variable if not set, otherwise grep fails
if [ -z "$zfslabel" ]; then
zfslabel="."
fi
if [ -z "$zfsfolder" ]; then
zfsfolder="."
fi
# use LC_ALL=C for getting output in english (otherwise months are not english and can not be handled by date command)
# -s creation sorts oldest first
if [ "$zfsrecursive" == "1" ]; then
echo "Searching for recursive snapshots containing: ${zfsfolder} and ${zfslabel}"
zfssnaplist=$(LC_ALL=C zfs list -H -t snapshot -o name,creation -s creation | grep "$zfsfolder" | grep "$zfslabel")
else
echo "Searching for snapshots containing: ${zfsfolder}@ and ${zfslabel}"
zfssnaplist=$(LC_ALL=C zfs list -H -t snapshot -o name,creation -s creation | grep "${zfsfolder}@" | grep "$zfslabel")
fi
if [ "$?" != "0" ]; then
echo "Error: Could not get list of snapshots"
exit $?
else
echo "OK: List of snapshots was created"
fi
keepgen=$(echo $snapkeep | egrep '^g[0-9]+$')
keepday=$(echo $snapkeep | egrep '^d[0-9]+$')
keephour=$(echo $snapkeep | egrep '^h[0-9]+$')
if [ -n "$keepgen" ] && [ -n "$zfssnaplist" ]; then
if [ "$zfsfolder" != "." ] && [ "$zfslabel" != "." ]; then
zfsfolderlist=$(zfs list -t snapshot -o name | grep "$zfsfolder" | cut -d'@' -f1 | uniq)
generations=$(echo "$snapkeep" | tr -d 'g')
echo "Keep generations $generations was specified in parameter"
for snapshot in $zfsfolderlist; do
i=0
#echo "test $snapshot"
echo "$zfssnaplist" | sed -n '1!G;h;$p' | grep ${snapshot}@ |
while read snapshot; do
i=$((i+1))
snapshotname=$(echo "$snapshot" | awk '{ print $1 }')
if [ $i -gt $generations ]; then
if [ "$dryrun" != "1" ]; then
zfssnapdestroy=$(zfs destroy $snapshotname)
if [ "$?" != "0" ]; then
echo "Error: could not destroy snapshot $snapshotname"
else
echo "OK: snapshot $snapshotname entry $i was destroyed"
fi
else
echo "Dryrun: snapshot $snapshotname entry $i was destroyed"
fi
else
echo "Keep snaphot $snapshotname entry $i"
fi
done
done
else
echo "Error: Either -F, -L was not specified, cannot determine generations from list"
exit $?
fi
elif ( [ -n "$keepday" ] || [ -n "$keephour" ] ) && ( [ -n "$zfssnaplist" ] ); then
if [ -n "$keepday" ]; then
alloweddays=$(echo "$snapkeep" | tr -d 'd')
echo "Keep days $alloweddays was specified in parameter"
elif [ -n "$keephour" ]; then
allowedhours=$(echo "$snapkeep" | tr -d 'h')
echo "Keep hours $allowedhours was specified in parameter"
else
echo "Error: could not get keep interval"
fi
echo "$zfssnaplist" |
while read snapshot; do
i=$((i+1))
snapshotdate=$(echo "$snapshot" | awk '{ print $3 "-" $4 "-" $6 }' ) # get date of snapshot i.e. Dec-26-2014
snapshothour=$(echo "$snapshot" | awk '{ print $5 }') # get time of snapshot i.e. 11:11
getsnapdatesec=$(date +%s -d "$snapshotdate") #get age of snapshot date in seconds since 1970
getsnaphoursec=$(date +%s -d "$snapshothour") #get age of snapshot time in seconds since 1970
getdatenowsec=$(date +%s -d $(LANG=C date +%b-%d-%Y)) #get today date in seconds since 1970
gethournowsec=$(date +%s -d $(LANG=C date +%H:%M)) #get today time in seconds since 1970
getsnapagedate=$(( $getdatenowsec - $getsnapdatesec )) #get difference of today and snapday date = age of snapshot in days
getsnapagehours=$(( $gethournowsec - $getsnaphoursec )) #get time difference of now and snapday time without full days between
getsnapage_s=$(( $getsnapagedate + $getsnapagehours ))
getsnapage_h=$(( $getsnapage_s / 3600 ))
getsnapage_d=$(( $getsnapage_s / 86400 ))
if [ -n "$alloweddays" ] && [ -n "$getsnapage_d" ]; then
snapshotname=$(echo "$snapshot" | awk '{ print $1 }')
if (( $getsnapage_d > $alloweddays )); then
if [ "$dryrun" != "1" ]; then
zfssnapdestroy=$(zfs destroy $snapshotname)
if [ "$?" != "0" ]; then
echo "Error: could not destroy $getsnapage_d days old snapshot $snapshotname from $snapshotdate $snapshothour"
else
echo "OK: $getsnapage_d days old snapshot $snapshotname from $snapshotdate $snapshothour was destroyed"
fi
else
echo "Dryrun: $getsnapage_d days old snapshot $snapshotname from $snapshotdate $snapshothour was destroyed"
fi
else
echo "Keep $getsnapage_d days old snapshot $snapshotname from $snapshotdate $snapshothour"
fi
elif [ -n "$allowedhours" ] && [ -n "$getsnapage_h" ]; then
snapshotname=$(echo "$snapshot" | awk '{ print $1 }')
if (( $getsnapage_h > $allowedhours )); then
if [ "$dryrun" != "1" ]; then
zfssnapdestroy=$(zfs destroy $snapshotname)
if [ "$?" != "0" ]; then
echo "Error: Could not destroy $getsnapage_h hours old snapshot $snapshotname from $snapshotdate $snapshothour"
else
echo "OK: $getsnapage_h hours old snapshot $snapshotname from $snapshotdate $snapshothour was destroyed"
fi
else
echo "Dryrun: $getsnapage_h hours old snapshot $snapshotname from $snapshotdate $snapshothour was destroyed"
fi
else
echo "Keep $getsnapage_h hours old snapshot $snapshotname from $snapshotdate $snapshothour"
fi
else
echo "Error: Could not calculate snapshot age ( got $getsnapage_d days = $getsnapage_h hours)"
fi
done
else
echo "Error: KEEP parameter $snapkeep missing or not valid or could not retrieve list of snapshots"
exit $?
fi
ghostadmin
Grand Admiral Special
Noch eine Sache: die vielen tee -a $blub kann man zu einem zusammenfassen, indem man alle Befehle in geschweifte Klammern setzt und dahinter das tee. Konkret:Das vermeidet überflüssige Wiederholungen und dadurch entstehende Tippfehler.Code:{ befehl 1 befehl 2 befehl 3 } | tee -a $blub
Wenn man das macht geht innerhalb vom tee kein exit mehr, gibts da einen Workaround?
Dalai
Grand Admiral Special
- Mitglied seit
- 14.06.2004
- Beiträge
- 7.420
- Renomée
- 262
- Standort
- Meiningen, Thüringen
- Mein Laptop
- Thinkpad T43 mit 15" UXGA (1600x1200), 2x 1 GiB RAM, 100GB HD, Bluetooth, GBit LAN, ATi X300
- Prozessor
- AMD Ryzen 5 2600 (Pinnacle Ridge)
- Mainboard
- ASUS Prime X370-A
- Kühlung
- Noctua NH-U12S mit 1x NF-F12
- Speicher
- Crucial Ballistix Sport LT weiß (BLS2K8G4D32AESCK): 2x 8 GiB DDR4-3200 (CL16) @ 1,25V
- Grafikprozessor
- Zotac GeForce GTX 1060 6GB AMP Edition
- Display
- Dell U2410, 24 Zoll, IPS, 16:10
- SSD
- Samsung 850 Evo 250 GB
- HDD
- WD40EZRZ (WD Blue) 4000GB SATA3, WD20EZRX (WD Green) 2000GB SATA3
- Optisches Laufwerk
- Pio DVR-212 (DVD-RAM), ASUS E818A6T (DVD-ROM), Pio DVD-106S (Slot-in DVD-ROM)
- Soundkarte
- Creative SoundBlaster Audigy 2 ZS PCI
- Gehäuse
- Lian Li PC-8NB Midi-Tower
- Netzteil
- Enermax EMP400AGT MaxPro 400W
- Betriebssystem
- Windows 7 Professional x64 und immer mal wieder ein neues Linux :-)
- Webbrowser
- Mozilla Firefox mit diversen Erweiterungen
- Verschiedenes
- 2x 120mm Gehäuselüfter (Front und Rückwand), DVBSky T9580, Sharkoon Frontpanel B (2x USB 3.0)
Kannst du ein Beispiel geben, inwiefern "innerhalb vom tee" kein Exit mehr geht? Oder anders gefragt: Wo ist das "innerhalb", wenn tee doch nur ein simpler (externer) Befehl ist?Wenn man das macht geht innerhalb vom tee kein exit mehr, gibts da einen Workaround?
MfG Dalai
tspoon
Grand Admiral Special
- Mitglied seit
- 23.04.2006
- Beiträge
- 2.727
- Renomée
- 196
- Standort
- Dresden
- Aktuelle Projekte
- was so anliegt
- Lieblingsprojekt
- WCG FightAIDS@Home
- Meine Systeme
- 2x Intel Xeon E5645 @ 2,4Ghz (Phobya UC-2 LT + 360 MagiCool Magicool G2)
- BOINC-Statistiken
- Prozessor
- Intel i7 4770K
- Mainboard
- Asus Maximus VI Gene 1150
- Kühlung
- XSPC RayStorm Wasserkühler
- Speicher
- 4 x 4GB Patriot Viper Extrem 2133
- Grafikprozessor
- 2 x AMD 290X Crossfire (Watercool HK GPU-X³)
- Display
- 3x27" Samsung S27D590 Curved
- SSD
- ADATA SP900NS34 m,2, 240GB Corsair Force 3
- HDD
- 1 TB WD Green
- Optisches Laufwerk
- LG USB-DVD-Brennder
- Gehäuse
- Xigmatek Aquila Window
- Netzteil
- Coolermaster Silent Pro 1000Watt (Singlerail)
- Betriebssystem
- Windows 8.1
- Webbrowser
- Chrome
- Verschiedenes
- T500Rs + TH8RS
- Schau Dir das System auf sysprofile.de an
Code:
(
{
echo "FEHLER"
exit 1
} || exit 1 ) | tee -a $LOGFILE
das exti innerhalb {} beendet nur die abarbeitung der befehle innerhalb {}
besser wäre aber ne richtige funktion anzulegen dafür
Code:
myfunction () {
echo 1
ls /verzeichnis1 || exit 1
echo 2
ls /verzeichnis2 || exit 1
echo 3
ls /verzeichnis3 || exit 1
}
....
( ( myfunction || echo "fehler verzeichnis nicht da"; exit 1 ) && echo erfolg) | tee -a $LOG
Zuletzt bearbeitet:
ghostadmin
Grand Admiral Special
Achso ist das.
in dem Beispiel wird aber trotzdem 555 ausgegeben und auch kein "error" oder "ok"
Code:
#!/bin/bash
test2() {
echo "123"
exit 1
echo "321"
}
test3() {
echo "555"
}
( ( test2 || echo "error"; exit 1 ) && echo "ok") | tee -a /tmp/test.tmp
( ( test3 || echo "error"; exit 1 ) && echo "ok") | tee -a /tmp/test.tmp
in dem Beispiel wird aber trotzdem 555 ausgegeben und auch kein "error" oder "ok"
Zuletzt bearbeitet:
Dalai
Grand Admiral Special
- Mitglied seit
- 14.06.2004
- Beiträge
- 7.420
- Renomée
- 262
- Standort
- Meiningen, Thüringen
- Mein Laptop
- Thinkpad T43 mit 15" UXGA (1600x1200), 2x 1 GiB RAM, 100GB HD, Bluetooth, GBit LAN, ATi X300
- Prozessor
- AMD Ryzen 5 2600 (Pinnacle Ridge)
- Mainboard
- ASUS Prime X370-A
- Kühlung
- Noctua NH-U12S mit 1x NF-F12
- Speicher
- Crucial Ballistix Sport LT weiß (BLS2K8G4D32AESCK): 2x 8 GiB DDR4-3200 (CL16) @ 1,25V
- Grafikprozessor
- Zotac GeForce GTX 1060 6GB AMP Edition
- Display
- Dell U2410, 24 Zoll, IPS, 16:10
- SSD
- Samsung 850 Evo 250 GB
- HDD
- WD40EZRZ (WD Blue) 4000GB SATA3, WD20EZRX (WD Green) 2000GB SATA3
- Optisches Laufwerk
- Pio DVR-212 (DVD-RAM), ASUS E818A6T (DVD-ROM), Pio DVD-106S (Slot-in DVD-ROM)
- Soundkarte
- Creative SoundBlaster Audigy 2 ZS PCI
- Gehäuse
- Lian Li PC-8NB Midi-Tower
- Netzteil
- Enermax EMP400AGT MaxPro 400W
- Betriebssystem
- Windows 7 Professional x64 und immer mal wieder ein neues Linux :-)
- Webbrowser
- Mozilla Firefox mit diversen Erweiterungen
- Verschiedenes
- 2x 120mm Gehäuselüfter (Front und Rückwand), DVBSky T9580, Sharkoon Frontpanel B (2x USB 3.0)
Logisch. Deine Funktion test3() enthält kein exit (mit Wert größer 0), also wird kein "echo error" gemacht. Danach geht der Fluss wohl weiter mit dem "exit 1", so dass kein "echo ok" ausgeführt wird.in dem Beispiel wird aber trotzdem 555 ausgegeben und auch kein "error" oder "ok"
Du kannst alternativ das Logging auch auslagern in eine Funktion, die du immer wieder aufrufst; ich mache das bei größeren Skripten so.
MfG Dalai
ghostadmin
Grand Admiral Special
Eigentlich sollte der doch hier den exit machen:
( ( test2 || echo "error"; exit 1 ) && echo "ok") | tee -a /tmp/test.tmp
____________________^^^^^
Sobald ich den | tee wegmache funktioniert es jedoch.
( ( test2 || echo "error"; exit 1 ) && echo "ok") | tee -a /tmp/test.tmp
____________________^^^^^
Sobald ich den | tee wegmache funktioniert es jedoch.
Dalai
Grand Admiral Special
- Mitglied seit
- 14.06.2004
- Beiträge
- 7.420
- Renomée
- 262
- Standort
- Meiningen, Thüringen
- Mein Laptop
- Thinkpad T43 mit 15" UXGA (1600x1200), 2x 1 GiB RAM, 100GB HD, Bluetooth, GBit LAN, ATi X300
- Prozessor
- AMD Ryzen 5 2600 (Pinnacle Ridge)
- Mainboard
- ASUS Prime X370-A
- Kühlung
- Noctua NH-U12S mit 1x NF-F12
- Speicher
- Crucial Ballistix Sport LT weiß (BLS2K8G4D32AESCK): 2x 8 GiB DDR4-3200 (CL16) @ 1,25V
- Grafikprozessor
- Zotac GeForce GTX 1060 6GB AMP Edition
- Display
- Dell U2410, 24 Zoll, IPS, 16:10
- SSD
- Samsung 850 Evo 250 GB
- HDD
- WD40EZRZ (WD Blue) 4000GB SATA3, WD20EZRX (WD Green) 2000GB SATA3
- Optisches Laufwerk
- Pio DVR-212 (DVD-RAM), ASUS E818A6T (DVD-ROM), Pio DVD-106S (Slot-in DVD-ROM)
- Soundkarte
- Creative SoundBlaster Audigy 2 ZS PCI
- Gehäuse
- Lian Li PC-8NB Midi-Tower
- Netzteil
- Enermax EMP400AGT MaxPro 400W
- Betriebssystem
- Windows 7 Professional x64 und immer mal wieder ein neues Linux :-)
- Webbrowser
- Mozilla Firefox mit diversen Erweiterungen
- Verschiedenes
- 2x 120mm Gehäuselüfter (Front und Rückwand), DVBSky T9580, Sharkoon Frontpanel B (2x USB 3.0)
Ich schätze, dass
zusammengehört und das Semikolon diese Befehlskette abschließt. Umgeschrieben sieht das doch so aus (jetzt mal unabhängig von den Subshells):
Aber ich sehe gerade, dass du dich über das gleiche Verhalten der Befehlsketten wunderst, obwohl doch die eine Funktion mit Exitcode ungleich 0 verlassen wird, die andere aber nicht. Du kannst ja mal mit return rumprobieren. Ich würde solche komplexen Konstrukte jedenfalls vermeiden, denn das Verhalten kann keiner garantieren; vielleicht ändert es sich mal in einer späteren Version der Bash, und unabhängig von der Shell dürfte das auch nicht immer sein - gibt ja noch ein paar mehr Shells.
MfG Dalai
Code:
test3 || echo "error"
Code:
test3 || echo error
exit 1
Aber ich sehe gerade, dass du dich über das gleiche Verhalten der Befehlsketten wunderst, obwohl doch die eine Funktion mit Exitcode ungleich 0 verlassen wird, die andere aber nicht. Du kannst ja mal mit return rumprobieren. Ich würde solche komplexen Konstrukte jedenfalls vermeiden, denn das Verhalten kann keiner garantieren; vielleicht ändert es sich mal in einer späteren Version der Bash, und unabhängig von der Shell dürfte das auch nicht immer sein - gibt ja noch ein paar mehr Shells.
MfG Dalai
ghostadmin
Grand Admiral Special
Ein return verlässt auch nur die sub.
"Aber ich sehe gerade, dass du dich über das gleiche Verhalten der Befehlsketten wunderst, obwohl doch die eine Funktion mit Exitcode ungleich 0 verlassen wird, die andere aber nicht."
Darum geht es nicht, die andere Sub soll überhaupt nicht gestartet werden. Der Exit funktioniert nicht (verlassen des Programms) wegen dem zusätzlichen Tee. Es ist also völlig egal was innerhalb test3 steht.
Wenn ich sowas in die erste Zeile packe dann bleibt das Script einfach stehen:
exec > >(tee -a /tmp/test.tmp)
exec > >(tee logfile)
"Aber ich sehe gerade, dass du dich über das gleiche Verhalten der Befehlsketten wunderst, obwohl doch die eine Funktion mit Exitcode ungleich 0 verlassen wird, die andere aber nicht."
Darum geht es nicht, die andere Sub soll überhaupt nicht gestartet werden. Der Exit funktioniert nicht (verlassen des Programms) wegen dem zusätzlichen Tee. Es ist also völlig egal was innerhalb test3 steht.
Wenn ich sowas in die erste Zeile packe dann bleibt das Script einfach stehen:
exec > >(tee -a /tmp/test.tmp)
exec > >(tee logfile)
Dalai
Grand Admiral Special
- Mitglied seit
- 14.06.2004
- Beiträge
- 7.420
- Renomée
- 262
- Standort
- Meiningen, Thüringen
- Mein Laptop
- Thinkpad T43 mit 15" UXGA (1600x1200), 2x 1 GiB RAM, 100GB HD, Bluetooth, GBit LAN, ATi X300
- Prozessor
- AMD Ryzen 5 2600 (Pinnacle Ridge)
- Mainboard
- ASUS Prime X370-A
- Kühlung
- Noctua NH-U12S mit 1x NF-F12
- Speicher
- Crucial Ballistix Sport LT weiß (BLS2K8G4D32AESCK): 2x 8 GiB DDR4-3200 (CL16) @ 1,25V
- Grafikprozessor
- Zotac GeForce GTX 1060 6GB AMP Edition
- Display
- Dell U2410, 24 Zoll, IPS, 16:10
- SSD
- Samsung 850 Evo 250 GB
- HDD
- WD40EZRZ (WD Blue) 4000GB SATA3, WD20EZRX (WD Green) 2000GB SATA3
- Optisches Laufwerk
- Pio DVR-212 (DVD-RAM), ASUS E818A6T (DVD-ROM), Pio DVD-106S (Slot-in DVD-ROM)
- Soundkarte
- Creative SoundBlaster Audigy 2 ZS PCI
- Gehäuse
- Lian Li PC-8NB Midi-Tower
- Netzteil
- Enermax EMP400AGT MaxPro 400W
- Betriebssystem
- Windows 7 Professional x64 und immer mal wieder ein neues Linux :-)
- Webbrowser
- Mozilla Firefox mit diversen Erweiterungen
- Verschiedenes
- 2x 120mm Gehäuselüfter (Front und Rückwand), DVBSky T9580, Sharkoon Frontpanel B (2x USB 3.0)
Wieso? Er verlässt doch den gerade laufenden Kontext. Nur ist das ein anderer als du denkst, nämlich die Funktion bzw. die Subshell.Der Exit funktioniert nicht (verlassen des Programms) wegen dem zusätzlichen Tee.
Ich glaube, es wäre besser, wenn du Exitcodes aus deiner Funktion zurückgibst und diese (auf der dann obersten Ebene) prüfst - dann kannst du auch das Skript verlassen. Und bedenke auch den Unterschied zwischen { } und ( ): die normalen Klammern starten eine Subshell, die geschweiften nicht.
MfG Dalai
tomturbo
Technische Administration, Dinosaurier
- Mitglied seit
- 30.11.2005
- Beiträge
- 9.455
- Renomée
- 665
- Standort
- Österreich
- Aktuelle Projekte
- Universe@HOME, Asteroids@HOME
- Lieblingsprojekt
- SETI@HOME
- Meine Systeme
- Xeon E3-1245V6; Raspberry Pi 4; Ryzen 1700X; EPIC 7351
- BOINC-Statistiken
- Mein Laptop
- Microsoft Surface Pro 4
- Prozessor
- R7 5800X
- Mainboard
- Asus ROG STRIX B550-A GAMING
- Kühlung
- Alpenfön Ben Nevis Rev B
- Speicher
- 2x32GB Mushkin, D464GB 3200-22 Essentials
- Grafikprozessor
- Sapphire Radeon RX 460 2GB
- Display
- BenQ PD3220U, 31.5" 4K
- SSD
- 1x HP SSD EX950 1TB, 1x SAMSUNG SSD 830 Series 256 GB, 1x Crucial_CT256MX100SSD1
- HDD
- Toshiba X300 5TB
- Optisches Laufwerk
- Samsung Brenner
- Soundkarte
- onboard
- Gehäuse
- Fractal Design Define R4
- Netzteil
- XFX 550W
- Tastatur
- Trust ASTA mechanical
- Maus
- irgend eine silent Maus
- Betriebssystem
- Arch Linux, Windows VM
- Webbrowser
- Firefox + Chromium + Konqueror
- Internetanbindung
-
▼300
▲50
Auf die Gefahr hin mich zu wiederholen
Bash ist nicht zum Programmieren da, sondern eine shell.
Zum Skriptprogrammieren gibt es viel besseres wie zum Beispiel perl, python oder ähnliches.
Wo alles in eher kontrollierten Bahnen läuft, gegenüber einer Shell die ihr Verhalten nach einem Releasewechsel (Bashbleed etwa) ändert.
Bash ist nicht zum Programmieren da, sondern eine shell.
Zum Skriptprogrammieren gibt es viel besseres wie zum Beispiel perl, python oder ähnliches.
Wo alles in eher kontrollierten Bahnen läuft, gegenüber einer Shell die ihr Verhalten nach einem Releasewechsel (Bashbleed etwa) ändert.
Dalai
Grand Admiral Special
- Mitglied seit
- 14.06.2004
- Beiträge
- 7.420
- Renomée
- 262
- Standort
- Meiningen, Thüringen
- Mein Laptop
- Thinkpad T43 mit 15" UXGA (1600x1200), 2x 1 GiB RAM, 100GB HD, Bluetooth, GBit LAN, ATi X300
- Prozessor
- AMD Ryzen 5 2600 (Pinnacle Ridge)
- Mainboard
- ASUS Prime X370-A
- Kühlung
- Noctua NH-U12S mit 1x NF-F12
- Speicher
- Crucial Ballistix Sport LT weiß (BLS2K8G4D32AESCK): 2x 8 GiB DDR4-3200 (CL16) @ 1,25V
- Grafikprozessor
- Zotac GeForce GTX 1060 6GB AMP Edition
- Display
- Dell U2410, 24 Zoll, IPS, 16:10
- SSD
- Samsung 850 Evo 250 GB
- HDD
- WD40EZRZ (WD Blue) 4000GB SATA3, WD20EZRX (WD Green) 2000GB SATA3
- Optisches Laufwerk
- Pio DVR-212 (DVD-RAM), ASUS E818A6T (DVD-ROM), Pio DVD-106S (Slot-in DVD-ROM)
- Soundkarte
- Creative SoundBlaster Audigy 2 ZS PCI
- Gehäuse
- Lian Li PC-8NB Midi-Tower
- Netzteil
- Enermax EMP400AGT MaxPro 400W
- Betriebssystem
- Windows 7 Professional x64 und immer mal wieder ein neues Linux :-)
- Webbrowser
- Mozilla Firefox mit diversen Erweiterungen
- Verschiedenes
- 2x 120mm Gehäuselüfter (Front und Rückwand), DVBSky T9580, Sharkoon Frontpanel B (2x USB 3.0)
[OT]
Tom: Im Prinzip hast du ja recht, aber man lernt nicht mal eben schnell eine andere Sprache, nur weil sie besser geeignet ist. Das kann nämlich unter Umständen zu groben Anfängerfehlern führen, die schwere Konsequenzen haben. Klar, Steam zeigt(e) gerade, dass man auch bei vermeintlich simplen Dingen total versagen kann .
[/OT]
MfG Dalai
Tom: Im Prinzip hast du ja recht, aber man lernt nicht mal eben schnell eine andere Sprache, nur weil sie besser geeignet ist. Das kann nämlich unter Umständen zu groben Anfängerfehlern führen, die schwere Konsequenzen haben. Klar, Steam zeigt(e) gerade, dass man auch bei vermeintlich simplen Dingen total versagen kann .
[/OT]
MfG Dalai
tomturbo
Technische Administration, Dinosaurier
- Mitglied seit
- 30.11.2005
- Beiträge
- 9.455
- Renomée
- 665
- Standort
- Österreich
- Aktuelle Projekte
- Universe@HOME, Asteroids@HOME
- Lieblingsprojekt
- SETI@HOME
- Meine Systeme
- Xeon E3-1245V6; Raspberry Pi 4; Ryzen 1700X; EPIC 7351
- BOINC-Statistiken
- Mein Laptop
- Microsoft Surface Pro 4
- Prozessor
- R7 5800X
- Mainboard
- Asus ROG STRIX B550-A GAMING
- Kühlung
- Alpenfön Ben Nevis Rev B
- Speicher
- 2x32GB Mushkin, D464GB 3200-22 Essentials
- Grafikprozessor
- Sapphire Radeon RX 460 2GB
- Display
- BenQ PD3220U, 31.5" 4K
- SSD
- 1x HP SSD EX950 1TB, 1x SAMSUNG SSD 830 Series 256 GB, 1x Crucial_CT256MX100SSD1
- HDD
- Toshiba X300 5TB
- Optisches Laufwerk
- Samsung Brenner
- Soundkarte
- onboard
- Gehäuse
- Fractal Design Define R4
- Netzteil
- XFX 550W
- Tastatur
- Trust ASTA mechanical
- Maus
- irgend eine silent Maus
- Betriebssystem
- Arch Linux, Windows VM
- Webbrowser
- Firefox + Chromium + Konqueror
- Internetanbindung
-
▼300
▲50
Also gerade etwas wie Perl lernt man im Vorbeigehen.
Die Syntax ist einfach und relativ geläufig.
Die Syntax ist einfach und relativ geläufig.
ghostadmin
Grand Admiral Special
Nur ist das ein anderer als du denkst, nämlich die Funktion bzw. die Subshell.
Nein das ist nicht anders als ich denke, irgendwie verstehst du nicht was ich schreibe. Ein Exit ist normalerweise dazu da das Script vollständig zu verlassen und das tut es wegen den { } eben nicht. Das was tspoon oben gepostet hat, hätte das verlassen des Scripts nach der ersten Routine bewirkt aber funktioniert leider auch nicht.
Ich glaube, es wäre besser, wenn du Exitcodes aus deiner Funktion zurückgibst und diese (auf der dann obersten Ebene) prüfst
Irgendwie umständlich aber wenns nicht anders geht.
Und es ist nicht so das ich kein Perl könnte aber für ein paar Systembefehle ist das wie Kanonen auf Spatzen und bei z.B. Nas4free ist kein Perl installiert.
tspoon
Grand Admiral Special
- Mitglied seit
- 23.04.2006
- Beiträge
- 2.727
- Renomée
- 196
- Standort
- Dresden
- Aktuelle Projekte
- was so anliegt
- Lieblingsprojekt
- WCG FightAIDS@Home
- Meine Systeme
- 2x Intel Xeon E5645 @ 2,4Ghz (Phobya UC-2 LT + 360 MagiCool Magicool G2)
- BOINC-Statistiken
- Prozessor
- Intel i7 4770K
- Mainboard
- Asus Maximus VI Gene 1150
- Kühlung
- XSPC RayStorm Wasserkühler
- Speicher
- 4 x 4GB Patriot Viper Extrem 2133
- Grafikprozessor
- 2 x AMD 290X Crossfire (Watercool HK GPU-X³)
- Display
- 3x27" Samsung S27D590 Curved
- SSD
- ADATA SP900NS34 m,2, 240GB Corsair Force 3
- HDD
- 1 TB WD Green
- Optisches Laufwerk
- LG USB-DVD-Brennder
- Gehäuse
- Xigmatek Aquila Window
- Netzteil
- Coolermaster Silent Pro 1000Watt (Singlerail)
- Betriebssystem
- Windows 8.1
- Webbrowser
- Chrome
- Verschiedenes
- T500Rs + TH8RS
- Schau Dir das System auf sysprofile.de an
Code:
.... gelöscht
wenn du hinter || oder && mehre befehle machen willst muss das wieder in ()
exit 1 in funktionen scheint nicht zu funktionieren da muss return 1 genutzt werden, hatte ich jetzt aber nicht so ausgiebig getestet
aber irgendwie will er das exit 1 nicht haben, denkmal das wieder das problem mit den verschachtelten funktionen etc.
Code:
.... gelöscht
so auslöser in eindeutig das | tee was den exit des scriptes verhindert.
vllt hilft das hier hat einer das gleiche problem
http://stackoverflow.com/questions/1221833/bash-pipe-output-and-capture-exit-status
Code:
[COLOR=#000000]( ( false || ( echo "error"; exit 1) ) && echo "ok") [/COLOR]
Code:
( ( true || ( echo "error"; exit 1) ) && echo "ok")
das funktioniert
Zuletzt bearbeitet:
Dalai
Grand Admiral Special
- Mitglied seit
- 14.06.2004
- Beiträge
- 7.420
- Renomée
- 262
- Standort
- Meiningen, Thüringen
- Mein Laptop
- Thinkpad T43 mit 15" UXGA (1600x1200), 2x 1 GiB RAM, 100GB HD, Bluetooth, GBit LAN, ATi X300
- Prozessor
- AMD Ryzen 5 2600 (Pinnacle Ridge)
- Mainboard
- ASUS Prime X370-A
- Kühlung
- Noctua NH-U12S mit 1x NF-F12
- Speicher
- Crucial Ballistix Sport LT weiß (BLS2K8G4D32AESCK): 2x 8 GiB DDR4-3200 (CL16) @ 1,25V
- Grafikprozessor
- Zotac GeForce GTX 1060 6GB AMP Edition
- Display
- Dell U2410, 24 Zoll, IPS, 16:10
- SSD
- Samsung 850 Evo 250 GB
- HDD
- WD40EZRZ (WD Blue) 4000GB SATA3, WD20EZRX (WD Green) 2000GB SATA3
- Optisches Laufwerk
- Pio DVR-212 (DVD-RAM), ASUS E818A6T (DVD-ROM), Pio DVD-106S (Slot-in DVD-ROM)
- Soundkarte
- Creative SoundBlaster Audigy 2 ZS PCI
- Gehäuse
- Lian Li PC-8NB Midi-Tower
- Netzteil
- Enermax EMP400AGT MaxPro 400W
- Betriebssystem
- Windows 7 Professional x64 und immer mal wieder ein neues Linux :-)
- Webbrowser
- Mozilla Firefox mit diversen Erweiterungen
- Verschiedenes
- 2x 120mm Gehäuselüfter (Front und Rückwand), DVBSky T9580, Sharkoon Frontpanel B (2x USB 3.0)
Wenn du mal in die Manpage schaust, wirst du lesen, dass eben genau das nicht notwendigerweise der Fall ist. Es wird die Shell beendet:Ein Exit ist normalerweise dazu da das Script vollständig zu verlassen
Und im Falle normaler Klammern ist das eben die Subshell. Wir sind hier nicht bei Windows, wo ein exit in der Tat alles abbricht, sofern man nicht /b benutzt, um nur die gerade laufende Batch zu beenden.man bash schrieb:exit [n]
Cause the shell to exit with a status of n. If n is omitted, the exit status is that of the last command executed.
Einfaches Testskript zur Demonstration:
Code:
#!/bin/bash
{
echo sub1
(
echo sub2
exit
echo sub2
)
echo ende
}
Na was nun? Oben war noch das tee schuld, nun sind's die geschweiften Klammern .und das tut es wegen den { } eben nicht.
MfG Dalai
Zuletzt bearbeitet:
tspoon
Grand Admiral Special
- Mitglied seit
- 23.04.2006
- Beiträge
- 2.727
- Renomée
- 196
- Standort
- Dresden
- Aktuelle Projekte
- was so anliegt
- Lieblingsprojekt
- WCG FightAIDS@Home
- Meine Systeme
- 2x Intel Xeon E5645 @ 2,4Ghz (Phobya UC-2 LT + 360 MagiCool Magicool G2)
- BOINC-Statistiken
- Prozessor
- Intel i7 4770K
- Mainboard
- Asus Maximus VI Gene 1150
- Kühlung
- XSPC RayStorm Wasserkühler
- Speicher
- 4 x 4GB Patriot Viper Extrem 2133
- Grafikprozessor
- 2 x AMD 290X Crossfire (Watercool HK GPU-X³)
- Display
- 3x27" Samsung S27D590 Curved
- SSD
- ADATA SP900NS34 m,2, 240GB Corsair Force 3
- HDD
- 1 TB WD Green
- Optisches Laufwerk
- LG USB-DVD-Brennder
- Gehäuse
- Xigmatek Aquila Window
- Netzteil
- Coolermaster Silent Pro 1000Watt (Singlerail)
- Betriebssystem
- Windows 8.1
- Webbrowser
- Chrome
- Verschiedenes
- T500Rs + TH8RS
- Schau Dir das System auf sysprofile.de an
es liegt an der kombination "funktion + tee" also an beiden
hier mal nen bsp was funktioniert:
wenn man das jetzt mit dem oben kombiniert:
ausgabe _________________________
./test_funktion_exit.sh
555
error
ne andere lösung hab ich erstmal nicht gefunden
quelle: http://stackoverflow.com/questions/985876/tee-and-exit-status
hier mal nen bsp was funktioniert:
Code:
false | tee /dev/null
[ $PIPESTATUS -eq 0 ] || exit $PIPESTATUS
wenn man das jetzt mit dem oben kombiniert:
Code:
test3 () {
# gehen mal davon aus das hier was nicht funktioniert
echo "555";
#return fehler mit status 1
return 1
}
## der befehl und fehler abfangen...
( ( test3 || ( echo "error"; exit 1) ) && echo "ok") | tee -a /tmp/test.tmp
##wenn fehler dann beenden
[ $PIPESTATUS -eq 0 ] || exit $PIPESTATUS
##
echo "text der nur ausgegeben wird wenn kein fehler vorliegt"
ausgabe _________________________
./test_funktion_exit.sh
555
error
ne andere lösung hab ich erstmal nicht gefunden
quelle: http://stackoverflow.com/questions/985876/tee-and-exit-status
ghostadmin
Grand Admiral Special
Das obige funktioniert aber ich habe jetzt was ganz einfaches gefunden das auch geht:
exec > >(tee -a /tmp/test.tmp 2>&1)
exec > >(tee -a /tmp/test.tmp 2>&1)
Ähnliche Themen
- Antworten
- 1
- Aufrufe
- 548
- Antworten
- 0
- Aufrufe
- 465
- Antworten
- 9
- Aufrufe
- 3K
- Antworten
- 7
- Aufrufe
- 4K