Mich erstaunendes Verhalten von echo in der bash
Liebe Liste, heute bin ich auf ein Verhalten von echo innerhalb der bash gestoßen, dass mich überrascht. Ich dachte bisher, echo gibt Strings aus. Ein echo Hallo? sollte demnach eine Zeile mit dem String "Hallo?" ausgeben. Tut es auch meistens. Wenn aber im entsprechenden Verzeichnis eine Datei mit dem Namen "Hallo!" existiert, dann erscheint "Hallo!" Wenn zusätzlich auch noch eine Datei "Hallo." existiert, dann führt ein echo Hallo? zur Ausgabe von "Hallo! Hallo." Sprich: Vor der Ausgabe des Strings behandelt echo den String als Filenamen und sucht nach passenden Expansionen. Ist das so gewollt? Kann ich das abstellen? Ein wenig habe ich die Befürchtung, dass die Expansion schon stattfindet, bevor echo den String erhält, also auf Shell-Ebene. Kann ich das abstellen? Ich weiß, dass echo "Hallo?" das gewünschte Ziel erreicht. Gruß Jan -- _________________________________________________________________ Jan Handwerker http://www.imk-tro.kit.edu/jan.handwerker.php
Handwerker, Jan wrote:
heute bin ich auf ein Verhalten von echo innerhalb der bash gestoßen, dass mich überrascht. Ich dachte bisher, echo gibt Strings aus. Ein
echo Hallo?
sollte demnach eine Zeile mit dem String "Hallo?" ausgeben. Tut es auch meistens. Wenn aber im entsprechenden Verzeichnis eine Datei mit dem Namen "Hallo!" existiert, dann erscheint "Hallo!" Wenn zusätzlich auch noch eine Datei "Hallo." existiert, dann führt ein
echo Hallo?
zur Ausgabe von "Hallo! Hallo."
Ich breche hier deine Ausführung ab. Lösung: "man bash" Das ist NICHT ein Verhalten von echo sondern das "normale" Pattern-Matching der Shell BEVOR die Parameter an ein Kommando übergeben werden. "?" und "*" werden von der Shell zuerst expandiert _bevor_ das Kommando das Ergebnis erhält. "?" steht für ein Zeichen wogegen "*" für beliebig viele Zeichen steht s. hier: root > touch 'Hallo!' root > echo Hallo? Hallo! Root > echo "Hallo?" Hallo? root> echo Hallo* Hallo! root> echo "Hallo*" Hallo* root> echo Hallo?? Hallo?? Klar soweit? Andreas
Am 15.01.2016 um 11:41 schrieb Kyek, Andreas, Vodafone DE:
Handwerker, Jan wrote:
heute bin ich auf ein Verhalten von echo innerhalb der bash gestoßen, dass mich überrascht. Ich dachte bisher, echo gibt Strings aus. Ein
echo Hallo?
sollte demnach eine Zeile mit dem String "Hallo?" ausgeben. Tut es auch meistens. Wenn aber im entsprechenden Verzeichnis eine Datei mit dem Namen "Hallo!" existiert, dann erscheint "Hallo!" Wenn zusätzlich auch noch eine Datei "Hallo." existiert, dann führt ein
echo Hallo?
zur Ausgabe von "Hallo! Hallo."
Ich breche hier deine Ausführung ab.
Lösung: "man bash"
Das ist NICHT ein Verhalten von echo sondern das "normale" Pattern-Matching der Shell BEVOR die Parameter an ein Kommando übergeben werden.
Wie ich schrieb (Du aber abschnittest :-) ) war das schon auch ein Verdacht von mir. Dazu aber noch die Rückfrage: Kann man die bash daran hindern? Aber vielen Dank schon mal! Herzliche Grüße Jan -- _________________________________________________________________ Jan Handwerker http://www.imk-tro.kit.edu/jan.handwerker.php
Am Freitag, 15. Januar 2016, 11:46:41 schrieb Handwerker, Jan:
Am 15.01.2016 um 11:41 schrieb Kyek, Andreas, Vodafone DE:
Handwerker, Jan wrote:
[...] Wenn aber im entsprechenden Verzeichnis eine Datei mit dem Namen "Hallo!" existiert, dann erscheint "Hallo!" Wenn zusätzlich auch noch eine Datei "Hallo." existiert, dann führt ein
echo Hallo?
zur Ausgabe von "Hallo! Hallo." [...] Lösung: "man bash"
Das ist NICHT ein Verhalten von echo sondern das "normale" Pattern-Matching der Shell BEVOR die Parameter an ein Kommando übergeben werden.
Wie ich schrieb (Du aber abschnittest :-) ) war das schon auch ein Verdacht von mir. Dazu aber noch die Rückfrage: Kann man die bash daran hindern?
Funktioniert vielleicht echo 'Hallo?' eventuell? Gruß Willi -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo Willi, hallo Liste, Am 16.01.2016 um 19:42 schrieb Wilhelm Boltz:
Am Freitag, 15. Januar 2016, 11:46:41 schrieb Handwerker, Jan:
Am 15.01.2016 um 11:41 schrieb Kyek, Andreas, Vodafone DE:
Handwerker, Jan wrote:
[...] Wenn aber im entsprechenden Verzeichnis eine Datei mit dem Namen "Hallo!" existiert, dann erscheint "Hallo!" Wenn zusätzlich auch noch eine Datei "Hallo." existiert, dann führt ein
echo Hallo?
zur Ausgabe von "Hallo! Hallo." [...] Lösung: "man bash"
Das ist NICHT ein Verhalten von echo sondern das "normale" Pattern-Matching der Shell BEVOR die Parameter an ein Kommando übergeben werden.
Wie ich schrieb (Du aber abschnittest :-) ) war das schon auch ein Verdacht von mir. Dazu aber noch die Rückfrage: Kann man die bash daran hindern?
Funktioniert vielleicht
echo 'Hallo?'
eventuell?
jepp. Tut es. Ganz ohne set -f. Kannst Du auch erklären, was der Unterschied zwischen '' und "" ist? Danke! Gruß Jan -- _________________________________________________________________ Jan Handwerker http://www.imk-tro.kit.edu/jan.handwerker.php
Hi, auch wenn die Frage nicht direkt an mich ging: '' evaluiert keine Variablen "" evaluiert Variablen var1=15 echo "$var1" --> 15 echo '$var' --> $var LG Gebhard -----Ursprüngliche Nachricht----- Von: Handwerker, Jan (IMK) [mailto:jan.handwerker@kit.edu] Gesendet: Montag, 18. Januar 2016 09:08 An: opensuse-de <opensuse-de@opensuse.org> Betreff: Re: Mich erstaunendes Verhalten von echo in der bash Hallo Willi, hallo Liste, Am 16.01.2016 um 19:42 schrieb Wilhelm Boltz:
Am Freitag, 15. Januar 2016, 11:46:41 schrieb Handwerker, Jan:
Am 15.01.2016 um 11:41 schrieb Kyek, Andreas, Vodafone DE:
Handwerker, Jan wrote:
[...] Wenn aber im entsprechenden Verzeichnis eine Datei mit dem Namen "Hallo!" existiert, dann erscheint "Hallo!" Wenn zusätzlich auch noch eine Datei "Hallo." existiert, dann führt ein
echo Hallo?
zur Ausgabe von "Hallo! Hallo." [...] Lösung: "man bash"
Das ist NICHT ein Verhalten von echo sondern das "normale" Pattern-Matching der Shell BEVOR die Parameter an ein Kommando übergeben werden.
Wie ich schrieb (Du aber abschnittest :-) ) war das schon auch ein Verdacht von mir. Dazu aber noch die Rückfrage: Kann man die bash daran hindern?
Funktioniert vielleicht
echo 'Hallo?'
eventuell?
jepp. Tut es. Ganz ohne set -f. Kannst Du auch erklären, was der Unterschied zwischen '' und "" ist? Danke! Gruß Jan -- _________________________________________________________________ Jan Handwerker http://www.imk-tro.kit.edu/jan.handwerker.php -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Danke! Danke! Danke! Dass ich das erst nach über 20 Jahren Linux klar kriege... :-( Gruß Jan Am 18.01.2016 um 09:40 schrieb Gebhard Przyrembel:
auch wenn die Frage nicht direkt an mich ging: '' evaluiert keine Variablen "" evaluiert Variablen
var1=15 echo "$var1" --> 15 echo '$var' --> $var
-- _________________________________________________________________ Jan Handwerker http://www.imk-tro.kit.edu/jan.handwerker.php
Hallo Jan, Am Mon, 18 Jan 2016 09:07:38 +0100 schrieb "Handwerker, Jan (IMK)" <jan.handwerker@kit.edu>:
Hallo Willi, hallo Liste,
Am 16.01.2016 um 19:42 schrieb Wilhelm Boltz:
Am Freitag, 15. Januar 2016, 11:46:41 schrieb Handwerker, Jan:
Am 15.01.2016 um 11:41 schrieb Kyek, Andreas, Vodafone DE:
Handwerker, Jan wrote:
[...] Funktioniert vielleicht
echo 'Hallo?'
eventuell?
jepp. Tut es. Ganz ohne set -f. Kannst Du auch erklären, was der Unterschied zwischen '' und "" ist?
sorry, nicht wirklich. Aber guggstu mal da: <https://de.wikibooks.org/wiki/Linux-Praxisbuch:_Shellprogrammierung> Gruß Willi -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, das liegt daran, dass das Hallo? Nicht als String angegeben ist und daher die Shell die File Name Expansion durchführt. Hat also nichts mit dem echo-Kommando zu tun. Wenn man dieses verhindern möchte kann man Echo "Hallo?" ausführen. So gesehen hast Du alles richtig erkannt: Bevor das Echo die Argumente bekommt führt die Shell bereits die Expansion durch. Du kannst das auch mit set -f in der Shell abschalten. Dann funktioniert die File Name Expansion aber insgesamt in der Shell nicht mehr, bis Du sie mit set +f wieder einschaltest. LG Gebhard -----Ursprüngliche Nachricht----- Von: Handwerker, Jan (IMK) [mailto:jan.handwerker@kit.edu] Gesendet: Freitag, 15. Januar 2016 11:33 An: opensuse-de Betreff: Mich erstaunendes Verhalten von echo in der bash Liebe Liste, heute bin ich auf ein Verhalten von echo innerhalb der bash gestoßen, dass mich überrascht. Ich dachte bisher, echo gibt Strings aus. Ein echo Hallo? sollte demnach eine Zeile mit dem String "Hallo?" ausgeben. Tut es auch meistens. Wenn aber im entsprechenden Verzeichnis eine Datei mit dem Namen "Hallo!" existiert, dann erscheint "Hallo!" Wenn zusätzlich auch noch eine Datei "Hallo." existiert, dann führt ein echo Hallo? zur Ausgabe von "Hallo! Hallo." Sprich: Vor der Ausgabe des Strings behandelt echo den String als Filenamen und sucht nach passenden Expansionen. Ist das so gewollt? Kann ich das abstellen? Ein wenig habe ich die Befürchtung, dass die Expansion schon stattfindet, bevor echo den String erhält, also auf Shell-Ebene. Kann ich das abstellen? Ich weiß, dass echo "Hallo?" das gewünschte Ziel erreicht. Gruß Jan -- _________________________________________________________________ Jan Handwerker http://www.imk-tro.kit.edu/jan.handwerker.php -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo Gebhard, yeah! Das war's. Das macht mir das Leben deutlich einfacher. Vielen Dank! Gruß Jan Am 15.01.2016 um 11:45 schrieb Gebhard Przyrembel:
Hallo,
das liegt daran, dass das Hallo? Nicht als String angegeben ist und daher die Shell die File Name Expansion durchführt. Hat also nichts mit dem echo-Kommando zu tun.
Wenn man dieses verhindern möchte kann man
Echo "Hallo?"
ausführen. So gesehen hast Du alles richtig erkannt: Bevor das Echo die Argumente bekommt führt die Shell bereits die Expansion durch.
Du kannst das auch mit set -f in der Shell abschalten. Dann funktioniert die File Name Expansion aber insgesamt in der Shell nicht mehr, bis Du sie mit set +f wieder einschaltest.
LG Gebhard
-----Ursprüngliche Nachricht----- Von: Handwerker, Jan (IMK) [mailto:jan.handwerker@kit.edu] Gesendet: Freitag, 15. Januar 2016 11:33 An: opensuse-de Betreff: Mich erstaunendes Verhalten von echo in der bash
Liebe Liste,
heute bin ich auf ein Verhalten von echo innerhalb der bash gestoßen, dass mich überrascht. Ich dachte bisher, echo gibt Strings aus. Ein
echo Hallo?
sollte demnach eine Zeile mit dem String "Hallo?" ausgeben. Tut es auch meistens. Wenn aber im entsprechenden Verzeichnis eine Datei mit dem Namen "Hallo!" existiert, dann erscheint "Hallo!" Wenn zusätzlich auch noch eine Datei "Hallo." existiert, dann führt ein
echo Hallo?
zur Ausgabe von "Hallo! Hallo."
Sprich: Vor der Ausgabe des Strings behandelt echo den String als Filenamen und sucht nach passenden Expansionen.
Ist das so gewollt? Kann ich das abstellen?
Ein wenig habe ich die Befürchtung, dass die Expansion schon stattfindet, bevor echo den String erhält, also auf Shell-Ebene. Kann ich das abstellen?
Ich weiß, dass echo "Hallo?" das gewünschte Ziel erreicht.
Gruß Jan
-- _________________________________________________________________ Jan Handwerker http://www.imk-tro.kit.edu/jan.handwerker.php
participants (4)
-
Gebhard Przyrembel
-
Handwerker, Jan (IMK)
-
Kyek, Andreas, Vodafone DE
-
Wilhelm Boltz