[Gelöst] Streams im Script programmatisch umleiten?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
MrScoville
Beiträge: 93
Registriert: 09.09.2016 17:20:59
Lizenz eigener Beiträge: MIT Lizenz

[Gelöst] Streams im Script programmatisch umleiten?

Beitrag von MrScoville » 21.10.2016 16:42:12

Hallo,

ich schon wieder... oO ;)

Folgendes ist klar (das if nur als Beispiel, klar gehts auch anders...):

if... # VAR ist 1
echo $TEXT > /var/log/...
elif... # VAR ist 2
echo $TEXT > /woanders/nocheintext
else
echo $TEXT > /dev/null
fi

Den letzten Teil habe ich aus Gründen eingebaut... Weil: Geht sowas auch als Einzeiler, wenn man das Ziel in eine Variable packt?

Ich hätte gerne etwas wie

echo $TEXT $ZIEL

Ich hab echo mit allen Tüdelchen ' " ' ` ausprobiert... Wollte alles ned. Also ich brauche wohl etwas wie fprintf in der Bash.
Zuletzt geändert von MrScoville am 28.10.2016 16:58:02, insgesamt 1-mal geändert.
Man mag gar nicht glauben, wie sehr ein 4096-bittiger RSA-Schlüssel einem den Tag vermiesen kann...^^

Der so genannte "Teufel im Detail" hat einen Namen: Tight coupling :evil:

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

Re: Streams im Script programmatisch umleiten?

Beitrag von smutbert » 21.10.2016 17:46:39

meinst du etwas anderes als

Code: Alles auswählen

echo $TEXT > $ZIEL

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: Streams im Script programmatisch umleiten?

Beitrag von newdeb » 22.10.2016 22:08:18

Ein "case" ist ihmo klarer:

Code: Alles auswählen

case $VAR in
1) ZIEL=/var/log/foo ;;
2) ZIEL=/woanders/nocheintext ;;
*) ZIEL=/dev/null ;;
esac
echo $TEXT >$ZIEL

MrScoville
Beiträge: 93
Registriert: 09.09.2016 17:20:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Streams im Script programmatisch umleiten?

Beitrag von MrScoville » 26.10.2016 20:11:02

smutbert hat geschrieben:meinst du etwas anderes als

Code: Alles auswählen

echo $TEXT > $ZIEL
Wer weiß? Ich nicht, ich Noob...

Also, in Deiner Schreibweise sollte $ZIEL sowohl eine Datei als auch &1 oder &2 (du weißt schon) sein können. /dev/null ist mir schon klar. Gibt es denn im Dateisystem in der Art von "alles ist eine Datei" auch $ZIELe für STDOUT UND STDERR? Dann wäre ich glücklich :)

LG
Man mag gar nicht glauben, wie sehr ein 4096-bittiger RSA-Schlüssel einem den Tag vermiesen kann...^^

Der so genannte "Teufel im Detail" hat einen Namen: Tight coupling :evil:

DeletedUserReAsG

Re: Streams im Script programmatisch umleiten?

Beitrag von DeletedUserReAsG » 26.10.2016 20:23:19

Schau’ unter /dev nach …

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

Re: Streams im Script programmatisch umleiten?

Beitrag von smutbert » 26.10.2016 20:24:20

aber natürlich ☺

Code: Alles auswählen

$ ls /dev/std*
/dev/stderr  /dev/stdin  /dev/stdout

MrScoville
Beiträge: 93
Registriert: 09.09.2016 17:20:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Streams im Script programmatisch umleiten?

Beitrag von MrScoville » 26.10.2016 20:40:35

smutbert hat geschrieben:aber natürlich ☺

Code: Alles auswählen

$ ls /dev/std*
/dev/stderr  /dev/stdin  /dev/stdout
Vielleicht sollte man erst einmal glauben und probieren statt zweifeln und ein Forum belästigen... (das war eine Notiz an mich selbst)...

Das alte Windows-Ich in mir wieder ;)

Danke!
Man mag gar nicht glauben, wie sehr ein 4096-bittiger RSA-Schlüssel einem den Tag vermiesen kann...^^

Der so genannte "Teufel im Detail" hat einen Namen: Tight coupling :evil:

MrScoville
Beiträge: 93
Registriert: 09.09.2016 17:20:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Streams im Script programmatisch umleiten?

Beitrag von MrScoville » 26.10.2016 20:48:45

So, jetzt muss ich aber doch noch einmal mäkeln...

Wegen so einer Antwort wie "Schau’ unter /dev nach …":

Okay, ich schau mal unter /dev nach. Wenn ich nicht die LS_COLORS aktiviert hätte, würde ich da erst einmal den Wald vor lauter Bäumen nicht sehen. Das mit den LS_COLORS hab ich mir auch erst vorhin angelesen.

Einfach mal ganz naiv nachgefragt: Wieso ist es in Linux-Kreisen so üblich, so herablassend zu antworten? Jau, ich bin ein Neuling, und wenn smutbert nicht ausnahmsweise (und das meine ich so, wie ich es schreibe: ausnahmsweise!) direkt auf den Punkt geantwortet hätte, würde ich heute nichts über Linux gelernt haben, sondern frustriert ins Bett gehen.

Ganz ernsthaft und nur zum Nachdenken gemeint... Ich gebe Nachhilfe in Physik und Mathematik. Ich denke mir oft auch: "Du lieber Himmel, das ist doch bitte einmal sooooooo banal? Wo kaufen deine Eltern ein, dass du so dumm bist??"

Der Unterschied ist halt, dass ich es mir nur denke und trotzdem wieder von vorn zu erklären anfange. Ich mag Lehrer sein, nicht bloß überlegen Wissender (was ich bei jedem Nachhilfe-Schüler zwangsläufig bin). Ich will etwas lehren, nicht mich suhlen.

Und ihr?

So, jetzt noch einmal smutbert: DANKE! Top!
Man mag gar nicht glauben, wie sehr ein 4096-bittiger RSA-Schlüssel einem den Tag vermiesen kann...^^

Der so genannte "Teufel im Detail" hat einen Namen: Tight coupling :evil:

DeletedUserReAsG

Re: Streams im Script programmatisch umleiten?

Beitrag von DeletedUserReAsG » 26.10.2016 21:00:55

Wenn du’s als herablassend empfunden hast, so tut’s mir leid. Das war nicht Intention – der Gedanke war: ‚er weiß, dass er std* sucht, wenn er sich also /dev/* listen lässt, wird es ihm ins Auge springen‘. Auch weiß ich nicht, was LS_COLORS mit diesem Thema zu tun hat, die Links stehen da auch in monocromer Auflistung. Im Übrigen vertrete ich die Ansicht, dass selbst erarbeitetes Wissen wertvoller ist, als vorgekautes Wissen. Auch, wenn es im ersten Moment einige Minuten mehr braucht.

uname
Beiträge: 12072
Registriert: 03.06.2008 09:33:02

Re: Streams im Script programmatisch umleiten?

Beitrag von uname » 26.10.2016 21:05:02

Da ich mit dem Thread noch nichts zu tun hatte, wollte ich mal beide Seiten betrachten.

a.) so schlecht war die Aussage nicht

Wenn ich was im Internet z.B. zu einem Debian-Thema suche, gebe ich einfach zusätzlich Debian als Suchbegriff ein. Die Suche nach "Umleitung Debian" oder "Ausgabeumleitung Debian" hätte in den ersten Treffern alles sehr gut erklärt. Die zusätzliche Suche nach "dev" hätte das Ergebnis noch verbessert.

b.) die Aussage war schlecht

Wenn man schon auf /dev hinweist, hätte man besser auf eine Internetseite oder gleich auf das richtige Ergebnis hinweisen können.
Ich für meinen Fall suche dann selbst im Internet, kontrolliere eben kurz ob der Inhalt auch wohl einigermaßen passt und poste dann den Link. In diesem Fall https://wiki.archlinux.de/title/Umleitungen oder vielleicht https://wiki.ubuntuusers.de/Shell/Umleitungen .

DeletedUserReAsG

Re: Streams im Script programmatisch umleiten?

Beitrag von DeletedUserReAsG » 26.10.2016 21:15:42

Da komme ich wieder nicht mit. Wenn ich schreibe, dass ich x und y suche, und jemand sagt mir, ich solle unter Verzeichnis z nachschauen, wäre mit das Letzte, was ich daraufhin machen würde, eine Suchmaschine zu bemühen.

MrScoville
Beiträge: 93
Registriert: 09.09.2016 17:20:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Streams im Script programmatisch umleiten?

Beitrag von MrScoville » 27.10.2016 20:51:26

Nachdem ich das hier ja los getreten habe, noch einmal ein paar Cents von mir dazu...

Als (wie gesagt) Nachhilfe-Lehrer bin ich grundsätzlich genau dieser Meinung, dass selbst erarbeitete Erkenntnis immer besser ist als vorgesagte Lösungen. Nun ist aber Linux ein so komplexes System, das -- anders als etwa Windows -- wirkliche Arbeit voraussetzt, wenn man ein System möchte, das so tickt, wie man es gerne hätte. Anders als Windows: da geht das eben nicht. Darum bin ich ja von Windows auf Liux gewechselt.

Oft hat man aber einfach einmal drängelnde Problemchen, wofür man eine Lösung sucht, um an einem größeren Problem arbeiten zu können.

Und manchmal sind solche älteren Ex-Windows-Nutzer auch ein bisschen altersstarrsinnig. Wie lange gibt es sed und awk schon? Ich bin erst jetzt dabei, mich in ihre Eleganz zu verlieben, statt immer mit PERL auf Spatzen zu schießen. Es ist doch so: Wer nur Nägel kennt, hält jedes Werkzeug für einen Hammer. Anders als Windows bietet Linux viel mehr Freiheiten, und anders als Windows ist Linux viel anstrengender.

Eigentlich, eigentlich möchte ich ja "nur" ein eigenes Linux für meine Haus-Steuerung so zusammenstellen, dass es möglichst "mean and lean" ist, ähnlich wie "Minibian", aber noch kompakter, entlang vom LFS-Ansatz. Dazu habe ich mir einen virtuellen Root-Server gemietet, der irgendwann einmal anhand aktueller Sourcen regelmäßig Updates bereitstellt für meine Raspberrys. Und da liegen viele, viele kleine Stolpersteinchen auf dem Weg, die mich manchmal mehr, manchmal weniger inspirieren. Je nach euren Antworten finde ich dann für mich -- wie im Fall von sed und awk -- heraus, dass es sich echt mal lohnen würde, den virtuellen Hintern von der Couch zu bekommen. "autoconf" und Co sind auch so Kandidaten.

Im Groben und Ganzen muss ich also lernen, wie man ein Linux über Architektur-Grenzen hinweg cross-baut, und nebenher muss ich meinen vhost noch vor DDoS abschirmen, also auch noch iptables und Co und Co und Co lernen.

In diesem Licht mögen meine Fragen sicher naiv und billig, aber hoffentlich akzeptiert sein? Danke! :)
Man mag gar nicht glauben, wie sehr ein 4096-bittiger RSA-Schlüssel einem den Tag vermiesen kann...^^

Der so genannte "Teufel im Detail" hat einen Namen: Tight coupling :evil:

uname
Beiträge: 12072
Registriert: 03.06.2008 09:33:02

Re: Streams im Script programmatisch umleiten?

Beitrag von uname » 27.10.2016 22:08:52

Schön geschrieben. Ich würde aber nicht sagen, dass Linux viel anstrengender ist als Windows. Linux oder spezial Debian hat viele Vorteile gegenüber Windows. Es ist nämlich durchgängig einheitlich und vor allem logisch. Das gilt für das Dateisystem, die Paketverwaltung, die Parameter von beliebigen Befehlen und vieles mehr. Hättest du genauso viel Zeit für Linux wie für Windows verwendest, würdest du Linux heute besser kennen als du Windows kennst. Windows lernt man nur oberflächlich kennen und über die Versionen sucht man maximal die ganzen Buttons und Menüs neu zusammen. Einen sagen wir mal akademischen Ansatz findet man eigentlich nur bei Linux.

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

Re: Streams im Script programmatisch umleiten?

Beitrag von heisenberg » 27.10.2016 22:43:38

Wie lange gibt es sed und awk schon? Ich bin erst jetzt dabei, mich in ihre Eleganz zu verlieben, statt immer mit PERL auf Spatzen zu schießen.
Ich habe jetzt vor kurzem auch wieder Perl hervorgekramt. Das kann von der Eleganz im Einzeilermodus aber locker an awk und sed vorbeiziehen - man muss vielleicht noch etwas dazu lernen.
Nun ist aber Linux ein so komplexes System, ... wirkliche Arbeit voraussetzt, wenn man ein System möchte, das so tickt, wie man es gerne hätte. ... LFS-Ansatz ...
Naja, wissen was Du willst, das musst Du schon. Auch nur in die Richtung gehen zu wollen den LFS-Ansatz zu verfolgen und gleichzeitig keinerlei Arbeit haben wollen, dass ist ein Widerspruch in sich. Es ist auch keine inhärente Eigenschaft von Linux kompliziert zu bedienen zu sein, wenn man sich komplizierte Dinge vornimmt. Du kannst ja einfach sagen, dass Du Debian nimmst und dann steht Dein System erst Mal, und dann ist es vielleicht nicht so schlank. Oder Du nimmst ein Debian ohne jegliche Zusatzpakete und installierst dann mit Bedacht nur einzelne weitere Pakete. Man kann sich durchaus aussuchen wieviel Arbeit man sich machen möchte. Ich selbst war für LFS / Gentoo immer viel zu faul und habe darum immer einen grossen Bogen gemacht. Deswegen bin ich ja Debiannutzer :)
Wieso ist es in Linux-Kreisen so üblich, so herablassend zu antworten?
Ich finde den Ton hier im Forum und auch in anderen Foren teilweise, regelmässig wiederkehrend sehr unfreundlich. Das ist so. Ich bin trotzdem (noch) hier und finde meinen Umgang mit dem Forum und den verschiedenen Menschen hier. Ich versuche die gefühlten Beleidigungen auszuhalten ohne Gegenangriff und trotzdem freundlich zu bleiben.

Zur Frage - Verschiedene Ausgabeziele verwenden:

Code: Alles auswählen

# Ansatz mit einem Array

VAR=2
targets=(/dev/stdin /dev/stderr /var/log/my.log)
echo ${targets[$VAR]}  # gibt "/var/log/my.log" aus
printf gibt es in der bash. Das Umlenkungszeichen, also z. B.: ">" kannst Du nicht in eine Variable packen. Das wird dann nicht als Umlenkungszeichen interpretiert sondern als Parameter oder Teil eines Parameters.

Code: Alles auswählen

x=">/dev/stderr"
echo hallo $x

Ausgabe: hallo >/dev/stderr   # >/dev/stderr wird also nicht als Umlenkung erkannt sondern von echo nur normal ausgegeben.
Im Übrigen: Bitte [ CODE ] - Tags verwenden. Damit kann man Code besser lesen.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

DeletedUserReAsG

Re: Streams im Script programmatisch umleiten?

Beitrag von DeletedUserReAsG » 28.10.2016 06:47:05

Ich bitte freundlichst und hochachtungsvoll weiterhin um eine Erklärung, inwiefern die Antwort „Schau’ unter [Verzeichnis] nach“ auf die Frage, ob es bestimmte Sachen gibt, herablassend oder gar unfreundlich ist, wenn die gesuchten Sachen unter [Verzeichnis] zu finden sind.

owl102

Re: Streams im Script programmatisch umleiten?

Beitrag von owl102 » 28.10.2016 10:47:31

Mir ist eine unfreundliche Antwort, die ich verwerten kann, viel lieber als eine freundliche, in der nichts drinsteht, was mich weiterbringt.

Hinzu kommt: Man muß wirklich aufpassen, was man wo hineininterpretiert. Man kann, wenn man will, die Antwort von niemand als unfreundlich interpretieren. Das funktioniert bei vielen Antworten, insbesondere, wenn sie kurz und knapp sind. Man kann sie aber auch als nicht-unfreundlich interpretieren, sondern als nett gemeinten Schubs in die richtige Richtung.

MrScoville
Beiträge: 93
Registriert: 09.09.2016 17:20:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Streams im Script programmatisch umleiten?

Beitrag von MrScoville » 28.10.2016 16:55:51

heisenberg hat geschrieben:Naja, wissen was Du willst, das musst Du schon. Auch nur in die Richtung gehen zu wollen den LFS-Ansatz zu verfolgen und gleichzeitig keinerlei Arbeit haben wollen, dass ist ein Widerspruch in sich.
Logisch steckt da Arbeit hinter. Was ich sagen wollte, ist: Irgendwann möchte man auch einmal Ergebnisse sehen. Im echten Leben(TM) habe ich vor vielen, vielen, vielen! Jahren mal Linux-Webserver betreut, aber damals(TM) wurde noch die Slackware auf Disketten ausgeliefert. Na ja, fast. Und seitdem hat sich so irre viel verändert, dass mein neuer Einstieg in Linux eben dies ist: ein Neueinstieg. Damals(TM) war das SysV-Init noch Stand der Dinge, heute eben systemd mit all seinen Reizen und Hustenreizen.

Wieso nun LFS? Nun, ich schreibe gerade von einem Debian-Laptop, und meinen vRoot habe ich auch als Debian-Server aufgesetzt. Ich bin mit Debian also, und jetzt wörtlich: "zufrieden". ;)

Das System, das ich gerne hätte, soll jedoch so kompakt wie möglich sein. Ein monolithischer Kernel, der die nötigsten Treiber (nur ext4 Dateisystem auf USB, keine Bildschirmausgabe, keine Tastatur, keine Maus, kein Sound, kein IDE, kein SATA, dafür das GPIO-Zeug für den Raspberry), und vor allem sowohl in 32-Bit (also ähnlich wie MiniBian) als auch 64-Bit (MiniBian gibt es für ARM Architekturen noch nicht als 64-Bit-Version). Dafür alles drin, was man benötigt, um ein über WLAN kommunizierendes IoT-Gerät sicher betreiben zu können (noch so eine Baustelle zum ganz viel Lesen und Lernen und Probieren). Weiterhin möchte ich eigentlich gar keine Daemonen außer Syslog und Apache2 laufen haben. Schon gar keinen systemd mit all seinen Konsorten (Zeitgeist und Co.). Für meine Zwecke frisst das alles nur Ressourcen auf einer vergleichsweise langsamen CPU.

Eventuell muss ich je nach Anwendung sogar noch ein paar Echtzeit-Patches in die Kernel-Sourcen reinbasteln. Davon wird's auch nicht schöner, sondern, genau: mehr Arbeit.
Zuletzt geändert von MrScoville am 28.10.2016 17:11:08, insgesamt 1-mal geändert.
Man mag gar nicht glauben, wie sehr ein 4096-bittiger RSA-Schlüssel einem den Tag vermiesen kann...^^

Der so genannte "Teufel im Detail" hat einen Namen: Tight coupling :evil:

MrScoville
Beiträge: 93
Registriert: 09.09.2016 17:20:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Streams im Script programmatisch umleiten?

Beitrag von MrScoville » 28.10.2016 17:05:45

heisenberg hat geschrieben:printf gibt es in der bash. Das Umlenkungszeichen, also z. B.: ">" kannst Du nicht in eine Variable packen. Das wird dann nicht als Umlenkungszeichen interpretiert sondern als Parameter oder Teil eines Parameters.
Ich habe das jetzt so gelöst:

Code: Alles auswählen

interactive=... # diverse Tests wie hier vorgeschlagen
if [ $interactive -eq 1 ]; then
    export SHOW_ONLY_IF_INTERACTIVE=''
else
    export SHOW_ONLY_IF_INTERACTIVE='>/dev/null'
fi
und in den aufgerufenen Scripten dann

Code: Alles auswählen

echo "Wert von HUGO ist $HUGO. $SHOW_ONLY_IF_INTERACTIVE"
Hat den Vorteil, dass ich beim Basteln diese Variable eben auch anders setzen kann (">/tmp/blablalog"), ohne anderen Code anfassen zu müssen wie etwa bei

Code: Alles auswählen

[[ $SHOW_ONLY_IF_INTERACTIVE -eq 1 ]] && echo...
Man mag gar nicht glauben, wie sehr ein 4096-bittiger RSA-Schlüssel einem den Tag vermiesen kann...^^

Der so genannte "Teufel im Detail" hat einen Namen: Tight coupling :evil:

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

Re: [Gelöst] Streams im Script programmatisch umleiten?

Beitrag von heisenberg » 28.10.2016 18:16:58

Wie wäre es so?

Code: Alles auswählen

#!/bin/bash

while getopts :dD: opt
do
   case $opt in
       d) export DEBUG=1 ;;
       D) USER_TARGET=$OPTARG;;
       ?) echo "Usage: $(basename $0) -d -D <logfile>"
   esac
done
export LOG_TARGET="${USER_TARGET:-/tmp/default.log}"

function my_debug { 
   if [ "$DEBUG" == "1" ]; then
      printf '%(%Y-%m-%d_%H:%M:%S)T : %s\n' "$*" >$LOG_TARGET;    # Date spawns no subprocess here
   }
}

# usage in code ...
my_debug "var blub=$blub"

Code: Alles auswählen

echo "Wert von HUGO ist $HUGO. $SHOW_ONLY_IF_INTERACTIVE"
Das - wie gesagt - geht nicht. Wenn, dann so:

Code: Alles auswählen

echo "Wert von HUGO ist $HUGO. >$SHOW_ONLY_IF_INTERACTIVE"
Zuletzt geändert von heisenberg am 28.10.2016 20:53:03, insgesamt 2-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

MrScoville
Beiträge: 93
Registriert: 09.09.2016 17:20:59
Lizenz eigener Beiträge: MIT Lizenz

Re: [Gelöst] Streams im Script programmatisch umleiten?

Beitrag von MrScoville » 28.10.2016 18:49:42

heisenberg hat geschrieben:

Code: Alles auswählen

echo "Wert von HUGO ist $HUGO. $SHOW_ONLY_IF_INTERACTIVE"
Das - wie gesagt - geht nicht.
Doch, geht, jedes meiner Scripte wird über bash -c aufgerufen, aus Gründen.
Man mag gar nicht glauben, wie sehr ein 4096-bittiger RSA-Schlüssel einem den Tag vermiesen kann...^^

Der so genannte "Teufel im Detail" hat einen Namen: Tight coupling :evil:

Benutzeravatar
weedy
Beiträge: 585
Registriert: 02.11.2002 21:47:49
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: [Gelöst] Streams im Script programmatisch umleiten?

Beitrag von weedy » 02.11.2016 00:08:12

Noch eine Anregung:

Code: Alles auswählen

A="> out.txt"
$ echo "hello world" $A
hello world > out.txt
$ eval 'echo "hello world" '"$A"
$ cat out.txt
hello world

Gruß

Antworten