Hallo, beim Einschlafen hatte ich so eine Eingebung, dass folgendes moeglich sein koennte. Das ist jetzt nur eine Idee ohne gross nachzudenken. Falls die Idee generell idiotisch ist, brauche ich mir darueber keine weiteren Gedanken zu machen. Ist folgendes irgendwie moeglich um eine while-Subshell zu umgehen? : mkfifo mypipe trap "rm -f mypipe" HUP INT TERM EXIT x=0 while blabla; do x=`expr $x + 1` machwas y="return von machwas" done <(find blablub >mypipe) echo $x echo $y Die Variablen x und y waeren im "Normalfall" (mit Subshell) find..| while..do..x.y..done innerhalb der Subshell und anschliessend nicht mehr verfuegbar. Das Auslagern in ein Temp-File moechte ich umgehen. Machbar? oder Schnappsidee? MfG Th. Moritz -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Am Freitag, 8. Oktober 2010 07:44:43 schrieb Thomas Moritz:
Ich schreibe mir mal selbst :-)
Da ich gerade kurz Zeit hatte, habe ich folgendes mit Erfolg getestet:
---./pipetest-------------------------
#!/bin/sh
mkfifo mypipe
trap "rm -f mypipe" HUP INT TERM EXIT
x=0
cat name.txt > mypipe &
while read name; do
x=`expr $x + 1`
echo "$name"
done
Am Freitag, 8. Oktober 2010 11:39:35 schrieb Thomas Moritz:
Am Freitag, 8. Oktober 2010 07:44:43 schrieb Thomas Moritz:
Bevor David wieder was zu meckern hat... :-) Den FIFO erzeuge ich jetzt aus Sicherheitsgruenden mit mktemp. #!/bin/sh myfifo=$(mktemp myfifo.XXXXXX) rm -f $myfifo mkfifo $myfifo trap "rm -f $myfifo" HUP INT TERM EXIT x=0 cat name.txt > $myfifo & while read name; do x=`expr $x + 1` echo "$name" done <$myfifo echo "Var x Ausserhalb von while= $x" Nun muss ich aber erstmal los ... MfG Th. Moritz -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Hallo, Am Fre, 08 Okt 2010, Thomas Moritz schrieb:
Am Freitag, 8. Oktober 2010 11:39:35 schrieb Thomas Moritz:
Am Freitag, 8. Oktober 2010 07:44:43 schrieb Thomas Moritz:
Bevor David wieder was zu meckern hat... :-) Den FIFO erzeuge ich jetzt aus Sicherheitsgruenden mit mktemp.
#!/bin/sh
Darf's auch bash sein (ne alte 2.03 reicht schon)?
myfifo=$(mktemp myfifo.XXXXXX) rm -f $myfifo mkfifo $myfifo
trap "rm -f $myfifo" HUP INT TERM EXIT
x=0 cat name.txt > $myfifo & while read name; do x=`expr $x + 1`
expr ist extern, also teuer.
echo "$name" done <$myfifo echo "Var x Ausserhalb von while= $x"
Warum so umst-Aändlich?-b ==== #!/bin/bash while read name; do x=$((x+1)); echo "$name"; done < <(find ...) echo "$x Dateien" ==== Ansonsten lies mal http://cboltz.de/de/linux/bash/ HTH, -dnh -- Fertility is hereditary. If your parents didn't have any children, neither will you. -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Am Freitag, 8. Oktober 2010 21:26:55 schrieb David Haller: Hallo,
x=`expr $x + 1`
expr ist extern, also teuer.
OK!
==== #!/bin/bash while read name; do x=$((x+1)); echo "$name"; done < <(find ...) echo "$x Dateien" ====
Das waren gestern meine ersten Versuche. Dabei erhielt ich sinngemaess: "Zeile 6: unerwartetes Zeichen <" Gerade nochmal probiert - geht - hmmm. Da lief wohl irgendwas schief. Der Fehler sitzt ja meistens an der Tastatur :-( MfG Th. Moritz -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Am Freitag, 8. Oktober 2010 21:26:55 schrieb David Haller: Hallo, jetzt brat' mir einer einen Storch :-( Bug oder Furure?¿? ======================= #!/bin/sh <<<<<<
On Sun, Oct 10, 2010 at 04:46:19PM +0200, Thomas Moritz wrote:
Am Freitag, 8. Oktober 2010 21:26:55 schrieb David Haller:
Hallo, jetzt brat' mir einer einen Storch :-( Bug oder Furure?¿?
======================= #!/bin/sh <<<<<<
echo $SHELL while read name; do x=$((x+1)); echo "$name"; done < <(cat name.txt) echo "$x Dateien" ======================= Output: /bin/bash <<<<<<
Setze ich den shabang auf #!/bin/bash
rennt alles zur Zufriedenheit. Das ist wohl der Punkt, andem ich mir vorgestern frueh die Zaehne ausgebissen haben :-(
echo $SHELL ... liefert in _beiden_ Faellen '/bin/bash'! Wie kommt es nun zu der unterschiedlichen Interpretation?
Je nachdem was in der ersten Zeile steht, wendet die Bash verschiedene Personalitaeten an. /bin/sh ist die POSIX shell ohne Bash extensions zb. Daher kommt das Verhalten. Ciao, Marcus -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Am Sonntag, 10. Oktober 2010 17:04:33 schrieb Marcus Meissner: Hallo Marcus, besten Dank fuer Deine schnelle Antwort, aber ...
Je nachdem was in der ersten Zeile steht, wendet die Bash verschiedene Personalitaeten an. /bin/sh ist die POSIX shell ohne Bash extensions zb.
Daher kommt das Verhalten.
Was mir trotzdem aus folgenden Gruenden nicht ganz klar wird: ls -l /bin/bash -rwxr-xr-x 1 root root 627376 5. Jul 13:47 /bin/bash ls -l /bin/sh lrwxrwxrwx 1 root root 4 20. Aug 18:35 /bin/sh -> bash $>sh -extensions $>bash -extensions allexport off allexport off braceexpand on braceexpand on emacs on emacs on errexit on errexit on errtrace off errtrace off functrace off functrace off hashall on hashall on histexpand on histexpand on history on history on ignoreeof off ignoreeof off interactive-comments on interactive-comment on keyword off keyword off monitor off monitor off noclobber off noclobber off noexec on noexec on noglob off noglob off nolog off nolog off notify off notify off nounset off nounset off onecmd on onecmd on physical off physical off pipefail off pipefail off posix off posix off privileged off privileged off verbose off verbose off vi off vi off xtrace on xtrace on sh-4.1$ bash-4.1$ MfG Th. Moritz -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Hallo Thomas, Am 10.10.10 18:04, schrieb Thomas Moritz:
Am Sonntag, 10. Oktober 2010 17:04:33 schrieb Marcus Meissner:
Hallo Marcus, besten Dank fuer Deine schnelle Antwort, aber ...
Je nachdem was in der ersten Zeile steht, wendet die Bash verschiedene Personalitaeten an. /bin/sh ist die POSIX shell ohne Bash extensions zb.
Daher kommt das Verhalten.
Was mir trotzdem aus folgenden Gruenden nicht ganz klar wird:
ls -l /bin/bash -rwxr-xr-x 1 root root 627376 5. Jul 13:47 /bin/bash
ls -l /bin/sh lrwxrwxrwx 1 root root 4 20. Aug 18:35 /bin/sh -> bash
Das Programm erkennt anhand von argv[0], über welchen Namen es aufgerufen wird. Daher ist das Verhalten unterschiedlich, obwohl ein und dasselbe Binary aufgerufen wird. Betrachte es einfach wie einen zusätzlichen Konfigurationsparameter.
$>sh -extensions $>bash -extensions
Nicht sämtliche Extensions sind aktiviert. Im Wesentlichen ist die Unterschiedung dazu da, dass das Verhalten 100 % kompatibel zur POSIX-/bin/sh ist. Um Skripte zu testen, ob sie auch gar keine Bash-Extension verwenden, taugt dieses Verhalten der bash nicht. Sonst würden ja praktisch alle Skripte out-of-the-box mit /bin/sh -> dash (oder Busybox ash oder nash) laufen. Gruß, Bernhard
Am Sonntag, 10. Oktober 2010 19:03:22 schrieb Bernhard Walle: Hallo Bernhard,
Das Programm erkennt anhand von argv[0], über welchen Namen es aufgerufen wird. Daher ist das Verhalten unterschiedlich, obwohl ein und dasselbe Binary aufgerufen wird. Betrachte es einfach wie einen zusätzlichen Konfigurationsparameter.
Alles klar! Danke fuer die Erleuchtung. Das ist also die von Marcus erwaehnte "Personalisierung". MfG Th. Moritz -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Am 10.10.10 19:13, schrieb Thomas Moritz:
Am Sonntag, 10. Oktober 2010 19:03:22 schrieb Bernhard Walle:
Das Programm erkennt anhand von argv[0], über welchen Namen es aufgerufen wird. Daher ist das Verhalten unterschiedlich, obwohl ein und dasselbe Binary aufgerufen wird. Betrachte es einfach wie einen zusätzlichen Konfigurationsparameter.
Alles klar! Danke fuer die Erleuchtung. Das ist also die von Marcus erwaehnte "Personalisierung".
Genau! Dazu das am Rande: Die sog. "Busybox", die oftmals in eingebetteten Linux-Systemen eingesetzt wird, treibt das übrigens auf die Spitze: Ein und dasselbe Binary stellt praktisch die gesamten Unix-Tools ("ls", "cp", "mv", "grep", "awk", "sed", "ifconfig" usw. usf. bis zu "lspci" oder "dmesg") zur Verfügung und jedes Programm ist einfach ein Symlink auf /bin/busybox. Natürlich in jeweils minimalistischen abgespeckten Varianten ohne Komfort. Das Ganze spart vor allem Speicherplatz und macht auch das Bauen teilweise einfacher da man nur ein Programm runterladen und konfigurieren muss und nicht ein ganzes Dutzend. Gruß, Bernhard
Am Sonntag, 10. Oktober 2010 19:17:09 schrieb Bernhard Walle: Hallo Bernhard,
Die sog. "Busybox", die oftmals in eingebetteten Linux-Systemen eingesetzt wird, treibt das übrigens auf die Spitze: Ein und dasselbe Binary stellt praktisch die gesamten Unix-Tools ("ls", "cp", "mv", "grep", "awk", "sed", "ifconfig" usw. usf. bis zu "lspci" oder "dmesg") zur Verfügung und jedes Programm ist einfach ein Symlink auf /bin/busybox. Natürlich in jeweils minimalistischen abgespeckten Varianten ohne Komfort.
Ich kenne busybox und auch die Funktionsweise aus verschiedenen Systemen. Damit musste ich mich schon mehrfach auseinandersetzen. Leider war ich auf dem Trip "sh=Link auf /bin/bash" ... muss doch auf's gleiche rauskommen. Jetzt ist der Knick wieder raus aus der Gehirnwindung! Danke! Man wird nicht juenger und wenn man sich erstmal an einem Irrtum festbeisst, dann braucht es eine Weile bis zur Korrektur :-( [peinlich!] Danke und einen schoenen Abend! MfG Th. Moritz -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Hallo, Am Son, 10 Okt 2010, Thomas Moritz schrieb:
Am Sonntag, 10. Oktober 2010 19:17:09 schrieb Bernhard Walle: Ich kenne busybox und auch die Funktionsweise aus verschiedenen Systemen. Damit musste ich mich schon mehrfach auseinandersetzen. Leider war ich auf dem Trip "sh=Link auf /bin/bash" ... muss doch auf's gleiche rauskommen. Jetzt ist der Knick wieder raus aus der Gehirnwindung! Danke! Man wird nicht juenger und wenn man sich erstmal an einem Irrtum festbeisst, dann braucht es eine Weile bis zur Korrektur :-( [peinlich!]
Awatt, auf sowas fällt fast jeder mal rein ;) Übrigens: ==== man bash ==== INVOCATION [..] If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well. ==== Die bash kann aber auch in dem Modus viel mehr als ne bourne shell, die ash ist da wesentlich näher dran. Beispiel: $ /bin/sh -c 'a=1;echo $((a+1));' 2 $ /bin/ash -c 'a=1;echo $((a+1));' a+1: not found HTH, -dnh -- <ToJe> .oO(select bla from fasel where laber like suelz) <wintermut> toje - order by gaehn <ToJe> wintermut: Stimmt, ich vergaß. (Toje, wintermut auf #i-tea) -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Am Montag, 11. Oktober 2010 07:21:13 schrieb David Haller: Hallo David,
Die bash kann aber auch in dem Modus viel mehr als ne bourne shell, die ash ist da wesentlich näher dran. Beispiel:
$ /bin/sh -c 'a=1;echo $((a+1));' 2 $ /bin/ash -c 'a=1;echo $((a+1));' a+1: not found
'busybox','zsh' und 'ksh' koennen's auch, nur eben die ash nicht. ls -l /bin/sh lrwxrwxrwx 1 root root 7 Jan 1 1970 /bin/sh -> busybox /bin/sh -c 'a=1;echo $((a+1));' 2 MfG Th. Moritz -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Hallo, Am Mon, 11 Okt 2010, Thomas Moritz schrieb:
Am Montag, 11. Oktober 2010 07:21:13 schrieb David Haller:
Die bash kann aber auch in dem Modus viel mehr als ne bourne shell, die ash ist da wesentlich näher dran. Beispiel:
$ /bin/sh -c 'a=1;echo $((a+1));' 2 $ /bin/ash -c 'a=1;echo $((a+1));' a+1: not found
'busybox','zsh' und 'ksh' koennen's auch, nur eben die ash nicht.
zsh und ksh sind ja auch POSIX kompatibel. Was die busybox genau ist/implementiert weiß ich jetzt nicht. Hierzu nochmal explizit: http://www.in-ulm.de/~mascheck/ ;) Die ash ist AFAIK die ("aktuelle" und Opensource) shell, die am nächsten an ner echten bourne-shell (/bin/sh) dran ist, und somit als kleinster gemeinsamer Nenner der bourne-Familie gut zum testen am besten geeignet, was als '#!/bin/sh'-Script durchgeht ... Interpretiert man '#!/bin/sh' als POSIX kann /bin/sh einiges mehr sein, zsh, ksh, (teils neuere) bash[1], bzgl. dash, busybox etc. kenn ich mich nicht aus. In de.comp.os.unix.shell wird da recht pragmatisch mit umgegangen, ohne Hinweis wird "POSIX-Shell" angenommen. womit ich auch keine Probleme habe, obwohl das ein oder andere davon hier in meiner ollen bash nicht funktioniert. Nicht POSIX sind z.B. ash, [t]csh, perlsh[2], ..., wobei die ash davon die einzige bourne-shell ist. HTH, -dnh [1] GNU bash hat(te) AFAIR teils inkompatible Abweichungen, aktuelle bash sind aber gut kompatibel, die von mir hier noch auf der ollen Kiste verwendeten 2.03 gibt's noch einige Haken und Ösen wo's nicht zu POSIX passt. [2] von der Syntax. Von den Features her schon (spätestens nach nem 'use POSIX;' bzw. dem in der preload.pl ;) -- It's 106 ms latency to Chicago, we've got a fullscale rant about NetSol and half a pack of work annoyances, it's dark, and we're typing with sunglasses.'' -- Hit it.'' -- Anthony de Boer -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Hallo Thomas, hallo Leute, Am Freitag, 8. Oktober 2010 schrieb Thomas Moritz:
Am Freitag, 8. Oktober 2010 11:39:35 schrieb Thomas Moritz:
Am Freitag, 8. Oktober 2010 07:44:43 schrieb Thomas Moritz:
Bevor David wieder was zu meckern hat... :-) Den FIFO erzeuge ich jetzt aus Sicherheitsgruenden mit mktemp.
myfifo=$(mktemp myfifo.XXXXXX) rm -f $myfifo mkfifo $myfifo
Damit hast Du das Risiko immerhin auf eine race condition reduziert ;-) (jemand könnte theoretisch zwischen rm und mkfifo eine Datei oder einen Symlink anlegen) mktemp kann leider selbst keinen FIFO anlegen, aber es gibt eine sichere Lösung: mktemp -d und dann in diesem Verzeichnis mkfifo ;-) Außerdem solltest Du bei einem Fehlschlag das Script abbrechen. Ungetestet: mytempdir=$(mktemp -d meinscript.XXXXXX) || exit 1 mkfifo "$mytempdir/myfifo" || exit 1 Zu Deinem eigentlichen Problem "Variablen sollen nach der Subshell noch verfügbar sein" brauchst Du übrigens nicht unbedingt einen FIFO. Es gibt verschiedene Varianten (Ausgabekanäle, "Verlängerung" der Subshell usw.) - siehe http://www.cboltz.de/de/linux/bash/ Gruß Christian Boltz -- Wozu überhaupt ein Script? Das kann man auch direkt aufrufen. Immer dieser Rationalisierungswahn. Demnächst verlangen einige Gurus noch, dass direkt in Binärcode geschrieben wird... [Sandy Drobic in suse-linux] -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Am Freitag, 8. Oktober 2010 22:13:50 schrieb Christian Boltz: Hallo Christian,
Am Freitag, 8. Oktober 2010 schrieb Thomas Moritz:
Am Freitag, 8. Oktober 2010 11:39:35 schrieb Thomas Moritz:
Am Freitag, 8. Oktober 2010 07:44:43 schrieb Thomas Moritz: Bevor David wieder was zu meckern hat... :-) Den FIFO erzeuge ich jetzt aus Sicherheitsgruenden mit mktemp.
myfifo=$(mktemp myfifo.XXXXXX) rm -f $myfifo mkfifo $myfifo
Damit hast Du das Risiko immerhin auf eine race condition reduziert ;-) (jemand könnte theoretisch zwischen rm und mkfifo eine Datei oder einen Symlink anlegen)
Das ist zwar knapp, aber zumindest theoretisch moeglich.
mktemp kann leider selbst keinen FIFO anlegen, aber es gibt eine sichere Lösung: mktemp -d und dann in diesem Verzeichnis mkfifo ;-) Außerdem solltest Du bei einem Fehlschlag das Script abbrechen.
Ungetestet: mytempdir=$(mktemp -d meinscript.XXXXXX) || exit 1 mkfifo "$mytempdir/myfifo" || exit 1
Danke fuer den Tip!
Zu Deinem eigentlichen Problem "Variablen sollen nach der Subshell noch verfügbar sein" brauchst Du übrigens nicht unbedingt einen FIFO. Es gibt verschiedene Varianten (Ausgabekanäle, "Verlängerung" der Subshell usw.) - siehe http://www.cboltz.de/de/linux/bash/
Oh man, Deine Seite habe ich sogar in den Lesezeichen! Danke und ein schoenes Wochenende. MfG Th. Moritz -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Hallo, Am Sam, 09 Okt 2010, Thomas Moritz schrieb:
Am Freitag, 8. Oktober 2010 22:13:50 schrieb Christian Boltz:
*knuddel*
Oh man, Deine Seite habe ich sogar in den Lesezeichen! Danke und ein schoenes Wochenende.
Nicht viel, aber gut ... und mehr als z.Z. bei mir! *schäm* :) "Ich sollte eigentlich"[tm] wohl mal ein Wiki mit "meinen" Tips anlegen oder so. Naja, solange mein /dev/brain noch gut tut, ich die MLs lesen und da schreibe ist das wohl nicht gar so schlimm ;) Und mein ~/bin/ und ~/lib/perl5 gibt's auch noch. Nur die "kanonische" weder GNU noch BSD spezifische 'find ... -exec' Variante sollte ich mir endlich mal aufschreiben. Ansonsten pflegt Sven Mascheck eine extrem gute Sammlung diverser Shell-Tips, -Tricks, -Marotten und -Spezifika: http://www.in-ulm.de/~mascheck/ Da findet sich u.a. auch Krams, was wo (nicht) läuft ... Und news:de.comp.os.unix.shell ist eine sehr gute (low-traffic) Gruppe, in der allerdings auf die Standards Wert gelegt wird[1], speziell sollte man jegl. Bashismen/GNUismen erwähnen (wenn man antwortet) bzw. als Frager sagen, welche Plattform (z.B. GNU/Linux mit z.B. GNU bash, find usw.) die (einzige) Zielplattform ist. Ohne Anmerkung wird von "POSIX" / SUSv4 (oder war's v3?) ausgegangen, dementsprechend bekommt man eben auch mal GNUismen/Bashismen oder Linux-spezifisches virtuell um die Ohren geschlagen ;) HTH, -dnh [1] siehe http://www.opengroup.org/ z.B. http://search.opengroup.org/search?q=find -- Connection reset by beer -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
participants (5)
-
Bernhard Walle
-
Christian Boltz
-
David Haller
-
Marcus Meissner
-
Thomas Moritz