Code: Alles auswählen
sh mein_script.sh /pfad/zu meiner/Datei mit Lehrzeichen.avi
Code: Alles auswählen
sh mein_script.sh /pfad/zu meiner/Datei mit Lehrzeichen.avi
Nur zum Verständnis, was bitte sind Lehrzeichen?The Hit-Man hat geschrieben:...dessen Pfad und auch Dateiname, Lehrzeichen enthält.
Das sind schlaue Zeichen, von denen man etwas lernen kann.detix hat geschrieben: Nur zum Verständnis, was bitte sind Lehrzeichen?
Entweder in Ticks/Anfuehrungszeichen packen:The Hit-Man hat geschrieben:Code: Alles auswählen
sh mein_script.sh /pfad/zu meiner/Datei mit Lehrzeichen.avi
Code: Alles auswählen
$ sh mein_script.sh '/pfad/zu meiner/Datei mit Lehrzeichen.avi'
$ sh mein_script.sh "/pfad/zu meiner/Datei mit Lehrzeichen.avi"
Code: Alles auswählen
#!/bin/sh
read -p 'enter filename ' arg1 # anstatt arg1="$1"
rm -f "$arg1" # mehr oder weniger sinnvolle Aktion
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
Code: Alles auswählen
./script.sh der\ pfad/der\ datei\ name
Nein! Bitte so einen Mist gleich gar nicht anfangen! Das widerspricht dem (guten!) Kommandozeileninterface-Stil von Unix. Schreibe deine Programme im gleichen Stil wie die anderen Programme sind: Dateinamen werden als Kommandozeilenargumente uebergeben. Wenn deine Dateinamen Whitespaces enthalten -- was sie nicht sollten -- dann musst du halt geeignet Quoten.Cae hat geschrieben: [...] oder, wenn der Benutzer das nicht extra eingeben soll, kann man auch read nehmen:Dann wird nach dem Starten interaktiv der Dateiname abgefragt, [...]Code: Alles auswählen
#!/bin/sh read -p 'enter filename ' arg1 # anstatt arg1="$1" rm -f "$arg1" # mehr oder weniger sinnvolle Aktion
Okay, ich geb' ja zu, dass das fuer den Grossteil der Anwendungen ungeeignet ist und die Usability kaputt macht. Aber willst du wirklich einen String wie f""oo'bar"b''az haendisch escapen [1]? Also wird man ein Tool nehmen/bauen, was einem das Escaping abnimmt -- welches dann sinnvollerweise aus einer Datei bzw. stdin befuellt wird, um besagtes Escaping nicht zu haben. Oder? Dann kann man's auch gleich im Programm selbst machen.Meillo hat geschrieben:Nein! Bitte so einen Mist gleich gar nicht anfangen!Cae hat geschrieben: [...] oder, wenn der Benutzer das nicht extra eingeben soll, kann man auch read nehmen:Dann wird nach dem Starten interaktiv der Dateiname abgefragt, [...]Code: Alles auswählen
#!/bin/sh read -p 'enter filename ' arg1 # anstatt arg1="$1" rm -f "$arg1" # mehr oder weniger sinnvolle Aktion
(Hervorhebung von mir) -- ist natuerlich auch ein Weg, solange man sich die Pfade bzw. Eingangsdaten aussuchen kann.Meillo hat geschrieben:Wenn deine Dateinamen Whitespaces enthalten -- was sie nicht sollten
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
Code: Alles auswählen
~> echo $(read -er s && printf %q "$s")
f""oo' bar"b''az
f\"\"oo\'\ bar\"b\'\'az
~>
Wer solche Dateinamen auf seinem System hat, soll sich zurecht damit rumschalgen muessen, sonst fangen die Leute noch an das zur Normalitaet werden zu lassen. Mit den Spaces ist es schon jetzt eine Qual. Wenn man in dieser Hinsicht anfaengt das System anzupassen, nur weil die Nutzer meinen sie brauchen das, dann fuehrt der Weg unweigerlich zu den Inkonsistenzen die man von Windows kennt. Ein klares, einheitliches System erhaelt man nur wenn man die klaren Konzepte hart durchsetzt. Haetten das die Jungs in den Bell Labs damals nicht getan, dann waere Unix heute nicht das was es ist. Und dennoch gab es auch da genug zu bekaempfen, wenn man an die Unix Wars denkt. Wenn man sich heute die unschoenen Stellen anschaut (z.B. Sockets) dann sind das eben genau die Folgen von scheinbar praktischen aber inkonsistenten Erweiterungen. In Plan 9 sieht man wie man es besser macht.Cae hat geschrieben: Aber willst du wirklich einen String wie f""oo'bar"b''az haendisch escapen [1]?
Code: Alles auswählen
01 - Rock 'n' Roll Gypsy (Rock 'n' Roll Outlaw).mp3
Es ist halt eine Frage der Praeferenz was man hoeher wertet: Die Konsistenz und Eleganz eines Systems oder die Moeglichkeit moeglichst viele und exakte Informationen in Dateinamen zu packen. Mir ist ersteres sehr wichtig. Bei zweiterem glaube ich, dass es der falsche Ansatz ist um das Problem zu loesen. Es gibt viel mehr sinnvolle Metadaten als man in einen Dateinamen packen kann und sollte. Wir brauchen deshalb keine laengeren Dateinamen mit noch mehr Sonderzeichen und am besten Unterformate, sondern die Moeglichkeit Metadaten sinnvoll abzulegen. Der Name einer Datei soll sie genausowenig beschreiben wie ihre Dateiendung. ... Aber das ist halt die Diskrepanz zwischen Soll und Ist.Phineas hat geschrieben:Aus meiner Musiksammlung:Sollte ich mich wirklich in die Steinzeit zurück begeben und so etwas ändern?Code: Alles auswählen
01 - Rock 'n' Roll Gypsy (Rock 'n' Roll Outlaw).mp3
Das war IMO ein Fehler. Zumindest das Newline-Zeichen haette man zusaetzlich verbieten sollten.Warum sind auf Linux-Dateisystemen denn alle Zeichen außer Slash und Nullbyte erlaubt?
Das ist IMO gerade nicht der Fall. Man hat nur scheinbar keinen Aerger damit. Anfangs mag es vielleicht auch geschickt sein, aber langfristig bricht jedes System auseinandern, das nicht konsequent wenigen klaren Konzepten folgt.Man gewöhnt sich an solche Dateinamen und mit der Zeit hat man immer weniger Ärger damit.
Bei mir hieße die Datei so:Phineas hat geschrieben:Aus meiner Musiksammlung:Sollte ich mich wirklich in die Steinzeit zurück begeben und so etwas ändern?Code: Alles auswählen
01 - Rock 'n' Roll Gypsy (Rock 'n' Roll Outlaw).mp3
Code: Alles auswählen
01_-_Helen_Schneider_-_Rock_n_Roll_Gypsy_Rock_n_Roll_Outlaw.mp3
Konsequent zuende gedacht landet man an dem Punkt wo der Dateiname der MD5-Summe (oder SHA1-Summe oder was auch immer) der Datei gleich ist.Meillo hat geschrieben:Es gibt viel mehr sinnvolle Metadaten als man in einen Dateinamen packen kann und sollte. Wir brauchen deshalb keine laengeren Dateinamen mit noch mehr Sonderzeichen und am besten Unterformate, sondern die Moeglichkeit Metadaten sinnvoll abzulegen. Der Name einer Datei soll sie genausowenig beschreiben wie ihre Dateiendung.
Bei heutigen Dateisystemen, ja.hikaru hat geschrieben:Konsequent zuende gedacht landet man an dem Punkt wo der Dateiname der MD5-Summe (oder SHA1-Summe oder was auch immer) der Datei gleich ist.Meillo hat geschrieben:Es gibt viel mehr sinnvolle Metadaten als man in einen Dateinamen packen kann und sollte. Wir brauchen deshalb keine laengeren Dateinamen mit noch mehr Sonderzeichen und am besten Unterformate, sondern die Moeglichkeit Metadaten sinnvoll abzulegen. Der Name einer Datei soll sie genausowenig beschreiben wie ihre Dateiendung.
Mir ist das dann doch etwas zu radikal. Ein gewisser Grundstock an menschenlesbaren Infos sollte da schon drin stecken.
Das allerdings meinte ich nicht. Ich glaube, dass es ein Fehler ist, die inhaltlichen (vielleicht auch die technischen) Metadaten im jeweiligen Dateiformat abzulegen. Entweder man packt die Nutzdaten in generische Container, wie beispielsweise bei Emails mit MIME. Oder man legt die Metadaten separat ab und verknuepft die (versionierten!) Nutzdaten ueber Hashwerte. Das ist dann wie bei der freedb. Oder so aehnlich wie bei Unix-Dateisystemen mit den Inodes und Daten-Nodes.Das Problem von Metadaten ist nämlich, dass es dafür kein einheitliches Format gibt. Ein id3-Tag* sieht anders aus als ein Vorbis-Comment oder das Matroska-EBML. Ganz zu schweigen von irgendwelchen völlig anderen Dateitypen mit völlig anderen Metainformationen wie L/OO-Dokumenten oder Plain-Text-Dateien die sowas gar nicht haben.
Code: Alles auswählen
$ cat ./arg
echo "$1"
$ cat ./auf
sh ./arg "$1"
$ sh ./auf 0x20:\ \"\ \"
0x20: " "
Code: Alles auswählen
echo nameserver $nameserver >>$new_resolv_conf