Auf der Suche nach einer vernünftigen Unix-Shell

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Auf der Suche nach einer vernünftigen Unix-Shell

Beitragvon henning » Sonntag 26. März 2006, 19:28

Unix-shells sind bei mir ein ewig-leidiges Thema.
Ich hab mich bis jetzt schon mit bash, zsh und auch kurz der rc-shell auseinander gesetzt.
Aber es gibt mindestens eine Anforderung, die auch sicher öfter auftritt, die noch keine erfüllt:

Angenommen ich hab ein Verzeichnis mit mehreren Dateien, welche alle Leerzeichen im Namen enthalten. Wenn ich jetzt ein Programm mit allen Dateinamen als parameter aufrufen will, muss ich schon anfangen, for-schleifen oder andere Umwege zu basteln, da diese shells nicht quoten :-(

Gibt es eine Shell, die damit vernünftig umgeht?
Wenn nein, wäre das hiermit ein Projektvorschlag. Bei der Gelegenheit könnte man mal wirklich leicht durschaubares Verhalten von " und ' einführen...
BlackJack

Beitragvon BlackJack » Sonntag 26. März 2006, 21:37

Ich glaube ich verstehe Dein Problem nicht ganz. Die Bash kann ganz wunderbar Programme mit Dateinamen mit Leerzeichen als Argumente starten. Bei der Vervollständigung via TAB werden Leerzeichen mit einem Backslash entwertet. Ansonsten kann man natürlich auch ' oder " benutzen. Und die zsh sollte das genauso machen.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: Auf der Suche nach einer vernünftigen Unix-Shell

Beitragvon Leonidas » Sonntag 26. März 2006, 21:39

henning hat geschrieben:Wenn nein, wäre das hiermit ein Projektvorschlag. Bei der Gelegenheit könnte man mal wirklich leicht durschaubares Verhalten von " und ' einführen...

Gibt's doch schon. IPythons pysh :P
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Montag 27. März 2006, 07:36

Funktioniert doch wunderbar (zumindest mit der bash unter Linux):

Code: Alles auswählen

~/zeugs/test> mkdir "hallo welt"
~/zeugs/test> ls
hallo welt
~/zeugs/test> emacs "hallo welt"/
~/zeugs/test> emacs hallo\ welt/

Tut genau das, was ich will. :)
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Beitragvon henning » Montag 27. März 2006, 08:37

Rebecca: Ich glaube du hast mein Problem nicht verstanden, es geht darum mehrere Dateien mit Leerzeichen im Namen einfach als Parameter mit * zu erzeugen, aber so, dass auch andere Programme als emacs das verstehen ,-)

Leonidas: IPython kenn ich, was ist pysh, wie komme ich da ran?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Montag 27. März 2006, 09:42

Vielleicht bin ich heute schwer von Begriff, aber du meinst sowas?:

Code: Alles auswählen

~/zeugs/test> mkdir "hallo welt" "hallo_welt"
~/zeugs/test> ls
hallo welt  hallo_welt
~/zeugs/test> ls -ad hallo*welt
hallo welt  hallo_welt
~/zeugs/test> ls -ad hallo[" "]welt
hallo welt
~/zeugs/test> ls -ad hallo[" "_]welt
hallo welt  hallo_welt

Jetzt mal davon abgesehen, dass Emacs gut ist :wink: , die Sternchen-Ersetzung macht doch die Shell und ist somit unabhaengig vom Programm? Also wo ist das Problem? *verwirrt ist*
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Beitragvon henning » Montag 27. März 2006, 10:00

Okay, ich hab mich vielleicht echt undeutlich ausgedrückt, aaalso:

Code: Alles auswählen

$ ls
Ein langer Dateiname.txt  Noch ein langer Name.foo  Und noch einer.bar


Das sind drei Dateien mit Leerzeichen im Namen.

Code: Alles auswählen

$ echo *
Ein langer Dateiname.txt Noch ein langer Name.foo Und noch einer.bar


Hier sieht man das Problem: Die Dateinamen werden ungequoted übergeben! Wenn ich jetzt z.B. ein python-programm habe, dass üder sys.argv Dateinamen erwartet, kriegt das schon Probleme die auseinanderzufummeln, und so gehts den meisten anderen Programmen auch.
Ich will halt, dass dieses Sternchen ein bisschen weniger dumm ist ,-)

Bei vielen Programmen gibt es schon Lösungen, Dateinameslisten anzugeben oder man kann mit print0 und xargs was machen etc...
Also das Problem ist natürlich lösbar. Aber ich finde das umständlich und unintuitiv, ich will eine Shell, bei der ich mich drauf verlassen kann das * als Parameter bedeutet, dass bei dem Programm alle Datein aus dem aktuellen Verzeichnis ankommen.

Kann doch nicht so schwer sein?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Montag 27. März 2006, 10:12

:idea:

Das ist in der Tat ein Problem...
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Beitragvon henning » Montag 27. März 2006, 10:25

Tjo... hab jetzt auch die pysh gefunden http://ipython.scipy.org/doc/manual/node12.html, die scheint das Problem aber auch nicht zu lösen und hat ausserdem kein job-control etc... da es ja im Grunde nur ein syntaxverbogener Python-Interpreter ist...
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Beitragvon querdenker » Montag 27. März 2006, 10:39

Vielleicht hilft dir der hier weiter: FSL

mfg, querdenker
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Beitragvon henning » Montag 27. März 2006, 10:46

Danke, scheint ein sehr nützliches Tool zu sein, aber mir will noch nicht so ganz in den Kopf, dass man für so eine einfache Sache wie "alle Dateien aus diesem Verzeichnis" in keiner shell eine wirklich einfache Lösung zur Hand hat. :cry:
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Beitragvon modelnine » Montag 27. März 2006, 11:39

... "alle Dateien aus diesem Verzeichnis" in keiner shell eine wirklich einfache Lösung zur Hand hat.


Möp?! Das ist keine Shell-Aufgabe, das ist eine Aufgabe für andere Tools wie zum Beispiel find.

Code: Alles auswählen

for i in `find -maxdepth 0 -type f`
do
    echo "Ich würde $i bearbeiten"
done


Unix-Shells können nicht viel, im allermeißten Fall sogar nur extrem wenig. Dafür gibts eine Unmenge von Tools die ich an die Shell anbauen kann (denn sogar die "Standardtools" wie ls sind keine integrierten Kommandos, sondern Tools), um Aufgaben zu erledigen. Wenn Du eine Shell willst die eine "Eierlegende Wollmilchsau" ist, hast Du die Unix-Philosophie nicht verstanden...
--- Heiko.
Benutzeravatar
chaos
User
Beiträge: 52
Registriert: Samstag 21. August 2004, 11:19

Beitragvon chaos » Montag 27. März 2006, 11:41

Also mit der zsh hab ich da kein Problem:

Code: Alles auswählen

 thomas@chaos /tmp % mkdir "foo sup"
 thomas@chaos /tmp % mkdir "foo sp"
 thomas@chaos /tmp % ls *
apr5RYJZv  barr       foo        foo bar    foo bat

foo sp:

foo sup:

kde-thomas:
[...]
Slackware will never die.
Benutzeravatar
chaos
User
Beiträge: 52
Registriert: Samstag 21. August 2004, 11:19

Beitragvon chaos » Montag 27. März 2006, 11:45

modelnine hat geschrieben:

Code: Alles auswählen

for i in `find -maxdepth 0 -type f`


Passender find Befehl:

Code: Alles auswählen

for i in `find . -maxdepth 1 -type f `

Zumindestens auf FreeBSD.
Slackware will never die.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Beitragvon modelnine » Montag 27. März 2006, 11:49

GNU-find nimmt standardmäßig das aktuelle Verzeichnis, wenn keins angegeben ist (sprich ohne den Punkt)... Aber maxdepth muss eins sein, damit er im aktuellen Verzeichnis sucht, ja.

Wenn man dann möchte dass er Dateien mit Leerzeichen im Namen (wer hat sowas, außer Windows-Usern?!) nicht trennt, muß man vorher zumindest in der Bash noch das Verhalten der Backticks anpassen:

Code: Alles auswählen

IFS="
"


Damit wird nur noch auf Leerzeilen getrennt.
--- Heiko.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder