* und die shell

  • Ich stehe gerade auf dem Schlauch.
    Vllt. kann mir jemand helfen:

    Code
    henk@pinky:/tmp/foo$ ls
    file1  file2
    henk@pinky:/tmp/foo$ echo *
    file1 file2
    henk@pinky:/tmp/foo$ echo :bar:*
    :bar:*
    henk@pinky:/tmp/foo$ echo ":bar:"*
    :bar:*


    Ich hätte bei Zeile 6 und 8 folgendes erwartet

    Code
    :bar:file1 file2


    Selbiges bei


    Oder kurz: Warum wird der * hier nicht von der lokalen shell interpretiert ?
    Beim scp von der remote shell aber sehr wohl ?

    Powered by Point of View ION330 und Mystique SaTiX-S2 Dual
    Geguckt wird auf einem 52PFL5605H/12 per HDMI mit Atmolight Quattro
    Audio optisch per Yamaha RX-V459 auf einem Teufel Concept P
    Non-TV content über XBMC und boblight
    Remote Harmony 525 durch Atric-IR
    Remote und Streaming mit Motorola XOOM und AndroVDR sowie Daroon Player
    Streaming auf ZBOX ID-81 und Desktop per streamdev
    All based on selfbuild OpenenELEC master


    Nebenbei noch ein par andere VDRs

    Einmal editiert, zuletzt von pinky666 ()

  • pinky666


    Probier's mal mal so:


    Code
    #/> echo ":bar:" $(ls *)

    Regards
    fnu

    HowTo: APT pinning

    2 Mal editiert, zuletzt von fnu ()

  • Schon klar. Ich will aber wissen, warum die shell sich so verhält.
    Irgendwie ist das nicht logisch für mich.

    Powered by Point of View ION330 und Mystique SaTiX-S2 Dual
    Geguckt wird auf einem 52PFL5605H/12 per HDMI mit Atmolight Quattro
    Audio optisch per Yamaha RX-V459 auf einem Teufel Concept P
    Non-TV content über XBMC und boblight
    Remote Harmony 525 durch Atric-IR
    Remote und Streaming mit Motorola XOOM und AndroVDR sowie Daroon Player
    Streaming auf ZBOX ID-81 und Desktop per streamdev
    All based on selfbuild OpenenELEC master


    Nebenbei noch ein par andere VDRs

  • Hallo!

    Zitat

    Original von pinky666
    Oder kurz: Warum wird der * hier nicht von der lokalen shell interpretiert ?
    Beim scp von der remote shell aber sehr wohl ?


    Die Shell versucht aufzulösen worauf sie Zugriff hat ("Dateinamen Vervollständigung"). Das sind z.B. lokale Dateien. Bei scp löst es nichts auf, da die Shell nicht weiß, was auf dem entfernten Rechner liegt, und übergibt deshalb das * an den scp Befehl.


    Das kann man schön an Deinen echo-Versuchen sehen:

    Code
    henk@pinky:/tmp/foo$ ls
    file1  file2
    henk@pinky:/tmp/foo$ echo *
    file1 file2
    henk@pinky:/tmp/foo$ echo :bar:*
    :bar:*
    henk@pinky:/tmp/foo$ echo ":bar:"*
    :bar:*


    Die Shell findet im aktuellen Verszeichnis nichts, das mit ":bar:" anfängt und kann deshalb auch nichts ersetzen. "*" steht nämlich nicht für "alle Dateien/Verzeichnisse".


    Genauer kannst Du das mit "man bash" im Abschnitt "Pathname Expansion" nachlesen.


    Gruß,
    Andreas

  • Zitat

    Original von amair
    Die Shell findet im aktuellen Verszeichnis nichts, das mit ":bar:" anfängt und kann deshalb auch nichts ersetzen.


    Danke ! Das macht Sinn und meine Welt ist wieder zurecht gerückt.

    Powered by Point of View ION330 und Mystique SaTiX-S2 Dual
    Geguckt wird auf einem 52PFL5605H/12 per HDMI mit Atmolight Quattro
    Audio optisch per Yamaha RX-V459 auf einem Teufel Concept P
    Non-TV content über XBMC und boblight
    Remote Harmony 525 durch Atric-IR
    Remote und Streaming mit Motorola XOOM und AndroVDR sowie Daroon Player
    Streaming auf ZBOX ID-81 und Desktop per streamdev
    All based on selfbuild OpenenELEC master


    Nebenbei noch ein par andere VDRs

  • Die Shell sucht generell nach Worten, die ? oder * enthalten, und versucht, zu diesem Wort Dateien zu finden. Wenn gefunden, ersetzt bereits die Shell das Wort durch alle passenden Dateinamen. Wird nichts gefunden, belässt die Shell den Parameter wie er ist, inklusive ? und *.


    Für DOS-Jünger ist es deshalb erst mal irritierend, dass dir *.txt /s von DOS/Win nicht als ls -r *.txt funktioniert. Unter DOS/Win ist jedes Programm selbst für das Auflösen von Platzhaltern zuständig, und kann so das /s vor dem * interpretieren. Unix sucht so nach Verzeichnissen, die auf *.txt enden, und zeigt diese komplett.



    Zitat

    Originally posted by pinky666

    Code
    henk@pinky:/tmp/foo$ /sbin/ifconfig eth0|grep "inet A"
              inet Adresse:192.168.0.6  Bcast:192.168.0.255  Maske:255.255.255.0
    henk@pinky:/tmp/foo$ ls 
    henk@pinky:/tmp/foo$ ssh root@192.168.0.98 ls /tmp/foo/
    file1
    file2
    henk@pinky:/tmp/foo$ scp root@192.168.0.98:/tmp/foo/* .
    file1                                                                                                        100%    0     0.0KB/s   00:00    
    file2                                                                                                        100%    0     0.0KB/s   00:00


    Erst mal versucht die lokale Shell root@192.168.0.98:/tmp/foo/* aufzulösen, findet aber lokal keine passenden Dateien. Deswegen wird es unverändert an ssh weiter gereicht. ssh wiederum versucht es dann auf dem Zielrechner nochmal, und kann dort dann den Namen auflösen.


    scp "root@192.168.0.98:/tmp/foo/*" . würde das gleiche machen, nur ohne den Versuch der lokalen Auflösung. Sollte man bei scp und * immer so schreiben. scp "\"root@192.168.0.98:/tmp/foo/*\"" . sollte dann beide Auflöseversuche unterdrücken, falls die Datei tatsächlich * heißt.


    Gruß,


    Udo

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!