mikrocontroller.net

Forum: PC-Programmierung Linux Script


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe mir ein kleines Script geschrieben, das meine Lazarus-Anwendung 
komprimieren soll. (Linux/Debian sh Script)
#!/bin/sh
echo 
echo Komprimiere Programm... ${PWD}
cd out
strip --strip-all FWUpdate
upx -9 -q FWUpdate
exit 0

Aber nix geht und google half mir leider auch nicht weiter. Darum die 
Frage:

Wie kriege ich das Script fehlerfrei zum Laufen?

Die Fehler bei Ausführung:
exit 0mm@ML99:~/Lazarus/FW_Update$ sh -v stripexe
#!/bin/sh
echo

echo Komprimiere Programm... ${PWD}
Komprimiere Programm... /home/mm/Lazarus/FW_Update
cd out
cd: 4: can't cd to out
strip --strip-all FWUpdate
': No such fileate
upx -9 -q FWUpdate
                       Ultimate Packer for eXecutables
  Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007
UPX 3.01        Markus Oberhumer, Laszlo Molnar & John Reiser   Jul 31st 2007

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
: FileNotFoundException: FWUpdate

Packed 0 files.
Das Verzeichnis out existiert, Berechtigungen und so sind auch gesetzt.
Wenn ich die Befehle von hand eingebe dann tuts.
Danke für eure Hilfe.

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem ist wohl der cd Befehl -- Rest hättest nicht posten brauchen.

Probier mal das Bash- bzw. Shell-Script nur mit dem cd Befehl.

Und dann probier mal einen absoluten Pfad:

cd out

pwd

pwd gibt dir den absoluten Pfad, beispielsweise "/home/stefan/out".

Im Script verwende dann die Ausgabe von pwd, also etwa

cd "/home/stefan/out"

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich wuerds mal mit "cd /out" probieren

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Autor: Matthias (Gast)
>ich wuerds mal mit "cd /out" probieren

Das macht doch nur Sinn, wenn out ein Verzeichnis auf der obersten Stufe 
wäre, wie /etc /home /usr usw.

Vielleicht ist es doch ein Problem mit den Berechtigungen?

Bei mir funktioniert cd im Script problemlos, sowohl mit vollständigen 
als auch lokalen Pfaden.

Und wenn das Verzeichnis nicht gefunden wird kommt bei mir eine Meldung 
wie

stefan@AMD64-X2 ~/Bash $ cd kjhgfg
-bash: cd: kjhgfg: Datei oder Verzeichnis nicht gefunden

Seltsam.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab jetzt das in im Script:
#!/bin/sh
pwd
cd out
Dann kommen die Meldungen:
root@ML99:/home/mm/Lazarus/FW_Update# sh -v test
sh -v test
#!/bin/sh
pwd
: not foundd
cd out
cd: 3: can't cd to out

Also nicht einmal das "pwd" funktioniert im Script ??!?!
Hat noch jemand eine Idee, was ich installieren muss. Ich nutze 
Sidux/Debian und hab es frisch installiert.

Ich habs getestet unter meinem User Name und mit root, es geht einfach 
nicht.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie kriege ich das Script fehlerfrei zum Laufen?

Indem du das Skript im Unix-Format (NL als Zeilenende) statt im
MSDOS-Format (CR/NL als Zeilenende) speicherst.

@Stefan Salewski:

> Und wenn das Verzeichnis nicht gefunden wird kommt bei mir eine
> Meldung wie
>
> stefan@AMD64-X2 ~/Bash $ cd kjhgfg
> -bash: cd: kjhgfg: Datei oder Verzeichnis nicht gefunden

Markus verwendet nicht die bash, sondern die dash. Da sehen die
Fehlermeldungen etwas anders aus.

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
yalu wrote:
> Indem du das Skript im Unix-Format (NL als Zeilenende) statt im
> MSDOS-Format (CR/NL als Zeilenende) speicherst.
Wollt ich auch gerade sagen.
Schau mal dein Script im HexEditor an, das Zeichen am Zeilenende muss 
0x0A sein, bei DOS/WIN ist das 0x0D, 0x0A (zwei Zeichen).
Das Script funktioniert aber nur mit einem Zeichen.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, ja. Um ein richtiges Linux Script zu generieren musste ich mein XP 
mit Notepad++ nutzen, der hat einen Konverter auf Unix drin.

Jetzt klappt auch der Script. Vielen Dank für die Hinweise!

sh ist doof. Jede menge super tolle funktionen drin, aber wenn ein CR 
kommt, dann bringt der nicht einmal eine Warnmeldung. Ist doch wohl 
schrottig und schlampig programmiert.
(Habe Datei mit KWrite bearbeitet.)

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Ich bin echt sauer auf diese Linux-Scheisse.
Hängt den programmierer auf!

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Um ein richtiges Linux Script zu generieren
> musste ich mein XP mit Notepad++ nutzen

Du Armer! Richtige Unix-Scripte (Linux-Scripte) kann man normalerweise 
auch mit richtigen Unix (Linux) erstellen. Hatte dein Linux Dialekt 
keinen Editor, daß du auf Windows ausweichen mußtest?

> Ich bin echt sauer auf diese Linux-Scheisse.

Das hat nix mit Linux zu tun. Das mit den unterschiedlichen 
Zeilenschaltungen bei Windows bzw. *NIX, *NUX und co (CR bzw. CR-LF) gab 
es schun seit 1970 seit den Urzeiten von UNIX. Da gab es die Micro*ft 
Scheisse noch nicht. Hätte sich Billy-Boy an die damaligen Standards 
gehalten und nix neues erfunden, dann wäre das problem heute nicht da 
(trift auch z.B. auf die Pfadangabe mit / bzw. \ zu)

Autor: egal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum bist du sauer?
Nur weil du nicht weist wie man mit sh und skripten um geht?

Wenn der Bauer nicht schwimmen kann da liegt es auch grundsätzlich der 
Badehose oder ?

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PS: Ich bin echt sauer auf diese Linux-Scheisse. Hängt den
> programmierer auf!

In Unix/Linux-Shell-Skripten ist <CR> (also das Zeichen mit dem
ASCII-Code 13) ein ganz normales Zeichen wie 'a' oder 'b'. Steht in
deinem Skript also
cd out<CR>

wird nach einem Verzeichnis mit dem Namen out<CR> gesucht und in deinem
Fall natürlich nicht gefunden. Ein Syntaxfehler ist das nicht, da <CR>
(wie auch jedes andere Zeichen außer '/' und <NULL>) in
Datei-/Verzeichnisnamen vorkommen darf. Und dass Steuerzeichen in
Dateinamen vorkommen dürfen, ist die konsequente Umsetzung der (in
meinen Augen sehr löblichen) Unix-Philosophie, funktionelle
Einschränkungen, die nicht technisch bedingt sind, zu vermeiden.

Damit solche Unfälle mit Steuerzeichen nicht passieren, werden alle
außer <TAB> und <NL> von den meisten Unix/Linux-Texteditoren im Klartext
angezeigt (<CR> bspw. als ^M, weil das Zeichen auf der Tastatur mit
Strg-M eingegeben wird).

Wenn man Cross-Development macht, also auf einem System Anwendungen für
ein anderes System entwickelt, muss man sich vorher im Klaren darüber
werden, welche Tools man dazu benötigt. Genauso, wie sich mit dem
Visual-C++-Compiler keine Programme für einen AVR-Controller entwickeln
lassen, kann man mit mit den meisten Windows-Texteditoren keine
Shell-Skripte für Linux schreiben.

Fazit: Der Bug sitz mal wieder, wie so oft, vor dem Computer ;-)

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fazit:
Wenn ich in einem Dateinamen ein <LF> drin stehen habe, dann kann ich 
die Datei nicht mit einem sh Script niemals bearbeiten.
Oder doch?

Autor: Gehängter Programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Oder doch?

Oder.

Du gehörst zu den 70% der Weltbevölkerung, die niemals mit Linux umgehen 
können werden. Macht ja nix, wir können schneller expandieren ohne euer 
Gejammer und ohne eure unverständlichen Fragen.

Wenn du cool sein willst, benutze cygwin unter Windows, das kann auch 
mit kranken Windows-Konventionen umgehen. Aber benutze bitte nie wieder 
echtes Linux.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus wrote:
> Fazit:
> Wenn ich in einem Dateinamen ein <LF> drin stehen habe, dann kann ich
> die Datei nicht mit einem sh Script niemals bearbeiten.
> Oder doch?

Doch. Dateinamen dürfen alle Zeichen außer / enthalten. Punkt. Also:
$ echo "blabla" > "Datei
mit
Leerzeilen
drinne"
$ ls
blabla???

ls maskiert die Leerzeilen als "?" damit die Ausgabe nicht zerschossen 
wird.

Autor: Linus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Doch. Dateinamen dürfen alle Zeichen außer / enthalten. Punkt.

Dürfen sie nicht. Was sie enthalten KÖNNEN, steht auf einem anderen 
Blatt.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Linus wrote:
>>Doch. Dateinamen dürfen alle Zeichen außer / enthalten. Punkt.
>
> Dürfen sie nicht. Was sie enthalten KÖNNEN, steht auf einem anderen
> Blatt.

Was "dürfen" sie denn außer / und evtl. dem Nullbyte bei 
nicht-UTF-System noch nicht enthalten?

Autor: Linus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Was "dürfen" sie denn außer / und evtl. dem Nullbyte bei
>nicht-UTF-System noch nicht enthalten?

RTFM. Du brauchst dich ja nicht dran zu halten. Du begehst auch keine 
Straftat, wenn du andere Zeichen benutzt. Aber im Sinne des Standards 
darfst du eben nicht alles, was du kannst.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Linus wrote:
>>Was "dürfen" sie denn außer / und evtl. dem Nullbyte bei
>>nicht-UTF-System noch nicht enthalten?
>
> RTFM. Du brauchst dich ja nicht dran zu halten. Du begehst auch keine
> Straftat, wenn du andere Zeichen benutzt. Aber im Sinne des Standards
> darfst du eben nicht alles, was du kannst.

Ja, habs gelesen (und nicht zum ersten Mal...) trotzdem find ich nix 
Verbotenes. Der ganze Name darf nicht "." und auch nicht ".." sein, 
klar, aber ansonsten find ich nur Empfehlungen, aber keine Verbote.

Autor: Linus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>aber ansonsten find ich nur Empfehlungen, aber keine Verbote.

Ja, es wird auch nur empfohlen, nicht den Bootsektor mit beliebigen 
Zeichen zu füllen, aber verboten ists nicht. Weißt du, mir geht dein 
Ich-habs-ja-nicht-so-gemeint-wie-ich-geschrieben-habe-Gerede auf den 
Senkel. Du kannst mit deinen Dateien machen was du willst, aber 
verbreite dein Unwissen doch besser nicht in Foren. Ja?

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht hier doch wohl nach wie vor um das Script sh.

Wenn ich das Script mit "sh -v" ausführe, dann erwarte ich doch dass mir 
gezeigt wird warum der Script nicht funktioniert.

Wenn das Linuxdoof sh mir dann folgende Zeile ausgespuckt hätte:

cd out^M

dann hätte ich nicht 3 Stunden nach dem scheiß Fehler gesucht und auch 
nicht dieses Forum belästigt.

Wie schon geschieben, sh ist doof.

Das händling der "Unsichtabren Zeichen" ist ja wohl verbesserungsdürftig 
und würen es den Windows Linux Umsteigern einfacher machen.

Nur wenn natürlich die Linux nutzer kein Interesse daran haben künftig 
Windows User zu gewinnen, dann seid Ihr selbst schuld. Ich bin 
programmierer schon seid vielen Jahren und programmiere prinzipiell 
Fehlertollerant gegenüber allem was von aussen kommen kann und bringe 
ordentliche Warnungen / Hinweise damit es auch ein DAU kapiert.
Anders ist Linux, wenn man da was falsches benutzt, dann Absturz, wub 
wub weg.

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ehrlich, bei so'nen Nörglern die keine Ahnung von garnix haben und wenn 
einmal was nicht klappt gleich rumheulen ist es "uns" egal.
Hättest du dich vorher ein bisschen über die Sache informiert, wär dir 
der Zeilenumbruch als mögliche Fehlerursache aufgefallen.

Aber du stellst dich lieber hin und erklärst Sachen für doof, die du 
nichtmal ansatzweise kennst oder verstehst, die Shell ist recht mächtig, 
du kannst damit zB. auch problemlos GUI Programme schreiben.

Autor: Sven P. (haku) Benutzerseite
Datum:
Angehängte Dateien:
  • preview image for vi.png
    vi.png
    16,3 KB, 137 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Linus wrote:
>>aber ansonsten find ich nur Empfehlungen, aber keine Verbote.
> Ja, es wird auch nur empfohlen, nicht den Bootsektor mit beliebigen
> Zeichen zu füllen, aber verboten ists nicht. Weißt du, mir geht dein
> Ich-habs-ja-nicht-so-gemeint-wie-ich-geschrieben-habe-Gerede auf den
> Senkel. Du kannst mit deinen Dateien machen was du willst, aber
> verbreite dein Unwissen doch besser nicht in Foren. Ja?

Komm mal wieder runter: Ich habe das genau so gemeint, wie ich es 
geschrieben habe. Dateinamen dürfen außer Schrägstrich und Nullbyte alle 
Zeichen des Zeichensatzes enthalten. Was das jetzt mit Unwissen zu tun 
hat, weiß ich nicht, und warum du dich direkt angepisst fühlst, weiß ich 
leider auch nicht. Also pöbel hier nicht rum, sondern zeig eine Manpage 
auf, oder das "andere Blatt", wo drauf steht, was sie enthalten 
können/dürfen, wenn du meinst, es genauer spezifizieren zu 
können/müssen. Oder sei einfach still.

Und Markus: Komm du auch mal wieder runter. Ich hab mich auch anfangs 
geärgert, wie du gerade. Aber frag dich mal, was Windows machen würde, 
wenn die Zeilenenden nach Linux-manier ankämen.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:

> Wenn ich das Script mit "sh -v" ausführe, dann erwarte ich doch dass
> mir gezeigt wird warum der Script nicht funktioniert.

Es wäre zu schön, wenn es einen Interpreter oder Compiler gäbe, der
einem bei einem syntaktisch korrekten Programm ganau sagt, warum es
nicht das tut, was man sich eigentlich vorgestellt hat ;-)

> Wenn das Linuxdoof sh mir dann folgende Zeile ausgespuckt hätte:
>
> cd out^M

Außer dir hat das so etwas bisher wahrscheinlich kaum jemand benötigt.
Aber du kannst das ja als neues Feature vorschlagen. Hier ist die
Web-Seite der von dir benutzten Shell:

  http://gondor.apana.org.au/~herbert/dash/

> Das händling der "Unsichtabren Zeichen" ist ja wohl verbesserungsdürftig
> und würen es den Windows Linux Umsteigern einfacher machen.

Bei Windows ist es nicht besser, im Gegenteil. Schau die folgende
Batch-Datei an:
RMDIR leeresverzeichnis
DIR /S /Q wichtigedateien
...

Zuerst wird leeresverzeichnis gelöscht. Falls es wider Erwarten nicht
leer sein sollte, erscheint die Meldung "Das Verzeichnis ist nicht leer"
und es wird nicht gelöscht. Dann wird das Verzeichnis wichtigedateien
rekursiv (/S) und mit Ausgabe des Dateibesitzers (/Q) aufgelistet. Also
alles ganz harmlos.

Was würde aber wohl passieren, wenn diese Batch-Datei auf einem
Mac-Editor (mit CR als Zeilenende) geschrieben worden wäre?

Da cmd.exe alle alleinstehenden CRs (und damit alle Zeilenenden)
ignoriert, werden alle Zeilen der Batch-Datei zu einer einzigen
zusammengefasst:
RMDIR leeresverzeichnisDIR /S /Q wichtigedateien ...

Dieser Befehl löscht leeresverzeichnisdir und wichtigedateien
rekursiv (/S) und ohne Sicherheitsabfrage (/Q). leeresverzeichnisDIR
wird wahrscheinlich nicht gefunden, aber die Daten in wichtigedateien
sind futsch.

Und was wäre, wenn die Batch-Datei folgendermaßen fortgesetzt würde?
REM ***********************************************
REM *  Windows ist in C:\ installiert.            *
REM *  In D:\ E:\ und F:\ liegen die User-daten.  *
REM ***********************************************

ABER BITTE NICHT AUSPROBIEREN!!!

> Ich bin programmierer schon seid vielen Jahren ...

Das kann ich kaum glauben, sonst hättest du keine 3 Stunden vergeblich
nach dem Fehler gesucht. Oder bist du HTML-Programmierer ;-)

Diese Ausgabezeilen
': No such fileate
               ^^^
: not foundd
           ^

hätten dir nämlich zeigen müssen, dass da etwas in der Ausgabe
überschrieben wurde. Das passiert typischerweise entweder bei
Pufferüberläufen im Programm oder eben bei der Ausgabe eines CR, wo
keins hingehört.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.