sed exit code ausgeben?

kongstrong

Well-Known Member
Moin Moin, wie erhält man den unter FreeBSD mittels bsd sed den exit code nach einer sed Operation. Ich versuche text in einer Datei zu ersetzen und würde gerne außer "0" eine 1 oder änliches erhalten wollen, wenn das ersetzen nicht geklappt hat. Wie funktioniert das den mit dem exit code ? Test schon den ganzen Tag aber ich finde einfach keine Lösung für mein problem.
 
Bei BSD sed ist alles >0 als Rückgabe ein "not successful"
GNU sed kann mehr in der Beziehung, aber tiefer hab ich mich damit noch nicht beschäftigt, ggf kannst du diesen mal testen?
 
Das hängt von deiner verwendeten Shell ab und hat nichts mit sed selbst zu tun.
 
Danke erstmal für eure Hilfe, also also Shell verwende ich "/bin/sh" unter FreeBSD 11.2.

Die sed Funktion zum ersetzen
Code:
#!/bin/sh

sed_einfügen(){
    sed -i '' '/\<\/tuning>/i \
    <syntax>\
    <tundesc>'"$(sysctl -dn ${1%%=*})"'</tundesc>\
    <tunname>'"${1%%=*}"'</tunname>\
    <tunvalue>'"5"'</tunvalue>\
    </syntax>\
' "$2"
}

sed_ersetzen "net.inet.tcp.tso=1" "datei.xml"

Sed sucht nach dem String </tuning> in der datei.xml und fügt drei Zeilen ein wenn der String </tuning> existiert.
Wenn allerdings der String </tuning> nicht gefunden wurde schreibt die sed_einfügen Funktion nicht und man erhält aber trotzdem
den Rückgabewert 0 !

Eigentlich müsste es doch möglich sein mit dem "-q" Schalter (steht für quit) zuerst nach dem </tuning> String zu suchen und wenn nicht
dieser nicht gefunden wurde oder gemacht wurde von sed, dann die sed funktion beended... leider habe ich bisher kein Erfolg weder einen
Rückgabewert größer 0 zu erhalten als auch einen "-q" Schalter vor dem ersten sed such Befehl (</tuning> zu platzieren...

Vielleicht wäre es am besten, nach dem die Funktion sed_einfügen fertig hat, einfach nochmals eine Suche, nach den drei eben hinzu
gefügten Zeilen in der datei.xml zu suchen, um ganz sicher zu gehen das korrekt geschrieben wurde...
 
Also -q ist eine GNU-Erweiterung (wie mir der Manpage auf dem Linux hier sagt). Unter FreeBSDs sed scheint es nicht zu existieren (https://www.freebsd.org/cgi/man.cgi....1-RELEASE+and+Ports&arch=default&format=html)

Dass du 0 bekommst ist auch korrekt, denn sed wurde ja ohne Fehler beendet. Dass er deinen String nicht gefunden hat ist kein Fehler zur Laufzeit sondern ein legitimes Ergebnis

EXIT STATUS
The sed utility exits 0 onsuccess, and >0if an error occurs.
 
vielleicht sollte man noch erklären, dass es den GNU-sed auch für FreeBSD gibt. Ob der auch tatsächlich identisch zu dem GNU-sed ist, kann ich nicht sagen, aber er heißt bei uns gsed und kann als Paket installiert werden.
 
vielleicht sollte man noch erklären, dass es den GNU-sed auch für FreeBSD gibt. Ob der auch tatsächlich identisch zu dem GNU-sed ist, kann ich nicht sagen, aber er heißt bei uns gsed und kann als Paket installiert werden.
Du hast Zweifel, ob etwas mit sich selbst identisch ist? :cool:
Ja, das ist GNU sed. Und der Port baut es mit --program-prefix=g damit man eine klare Unterscheidbarkeit hat. Bis auf den Namen des Binaries ändert das nichts.
 
vielleicht sollte man noch erklären, dass es einen GNU-sed auch für FreeBSD gibt...
besser?

Ich habe das gelesen, aber nicht selbst probiert.
Die wenigen und ganz rudimentären Dinge, für die ich sed brauche, gelingen mir in der Regel mit dem FreeBSD-sed. Eigentlich besser, als mit dem GNU-sed, weil ich mich halt an die einfachere Syntax gewöhnt habe.
Deshalb weiß ich eben nicht aus eigener Erfahrung, ob dieser gsed unter FreeBSD auch tatsächlich identisch mit dem GNU-sed ist, den man unter einem GNU/Linux ausgeliefert bekommt. Das könnte ja auch eine abgespeckte Variante sein. Ich weiß das halt nicht.

Da @Zirias es uns eindeutig erklärt hat: man kann also auch unter FreeBSD den GNU-sed nutzen und er heißt hier gsed und ist ein Paket, muss also zusätzlich installiert werden, landet dann nicht im System direkt, sondern unter /usr/local und man muss halt überlegen, wie man den dann aufruft. Da gibt es sicher mehrere Möglichkeiten und @Zirias installiert aus den Ports und setzt eine Option beim Bauen. Ein statischer Link könnte auch nützlich sein, so lange man weiß, was man tut und ein Alias in der shell würde mir persönlich gut gefallen.
 
Das ist eine sed-Funktion, kein Kommandozeilenparameter.

Rob
Stimmt, Recht hast Du... war wohl mal wieder zu lange am PC... vor lauter "-q" "q" "-Q" "Q" habe ich da was durch einander gewürfelt...

Ich glaube ich komme so langsam zu dem Ergebnis, dass mit dem handels üblichen "sed" was bei BSD meist schon mit dabei ist, gibt es keine Möglichkeit wie bei dem gnu sed, einen EXIT Status Code per Parameter/Funktion selber zu bestimmen.
 
Zuletzt bearbeitet:
Zurück
Oben