Seite 1 von 2

Verfasst: Donnerstag 7. Mai 2009, 10:23
von whaeva
Gehört nicht direkt zur Fragestellung, aber:
Einem Skript möchte ich als Argument Dateien mit Wildcard verklickern, z.B.:

Code: Alles auswählen

script.py *.ext
Dann wäre es ein Leichtes, mit glob(argv[1]) die Liste zu bekommen.

Leider passiert in meiner Shell aber folgendes nicht:

Code: Alles auswählen

argv[1] >> '*.ext'
argv[1] >> 'file1.ext file2.ext ...'
sondern

Code: Alles auswählen

argv[1] >> 'file1.ext'
Was genau passiert da und wie vermeidet man es?

Verfasst: Donnerstag 7. Mai 2009, 10:39
von EyDu
*.ext wird zunächst von deiner Shell bearbeitet und damit natürlich durch die entsprechenden Dateien ersetzt. Versuch einfach mal:

Code: Alles auswählen

script.py "*.ext"

Verfasst: Donnerstag 7. Mai 2009, 10:48
von lunar
Das ist doch unsinnig. Zum einen dupliziert man damit die Arbeit der Shell, zumal diverse Shells wie die zsh weitaus mächtigere Globbing-Features bereitstellen als die "glob()" -Funktion. Zum anderen erschwert man das Escaping: Angenommen, der Nutzer hat eine Datei mit einem Sternchen im Namen. Ruft man "glob()" nochmals manuell auf, muss der Nutzer zweimal Escapen, das erste Mal, um die Shell am Globbing zu hindern, das zweite Mal, um das Programm daran zu hindern.

"glob()" manuell aufzurufen, führt nur zu für den Benutzer unerwarteten Effekten. Anstatt manuell zu globben und der Shell damit ins Handwerk zu pfuschen, sollte man sie einfach ihre Arbeit tun lassen und einfach mit mit der sys.argv()-Liste arbeiten.

Verfasst: Donnerstag 7. Mai 2009, 11:11
von whaeva
Danke, habe mein Problem erkannt:
* wird von der Shell zu "file1 file2 file3" umgebaut - argv >> ['file1', 'file2' ,'file3']

Verfasst: Donnerstag 7. Mai 2009, 12:51
von Rebecca
Hyperion hat geschrieben:

Code: Alles auswählen

rm -r /home/irgendwas/nochwas/ *
Oh ja... :roll:

Verfasst: Donnerstag 7. Mai 2009, 14:43
von Leonidas
whaeva hat geschrieben:Danke, habe mein Problem erkannt:
* wird von der Shell zu "file1 file2 file3" umgebaut - argv >> ['file1', 'file2' ,'file3']
Nicht jede Shell. Bei DOS und ich denke auch dass es in Windows so ist, müssen die Programme selbst 'glob'ben.