Peter: Warum funktioniert Verzeichnisswechsel in Bashdatei nicht?

Hallo,

b.sh:

#!/bin/bash
cd ..
pwd

Ergebnis:

Peter@Peter ~
$ ./b.sh
: No such file or directory
/home/Peter

Warum funktioniert der Verzeichniswechsel nicht? Bzw., wie kann ich das verzeichnis wechseln?

Peter

  1. Also, bei mir "tut" es ... und das sollte es auch:

    #!/bin/bash
    pwd
    cd ..
    pwd
    
    1. Also, bei mir "tut" es ... und das sollte es auch:

      #!/bin/bash
      pwd
      cd ..
      pwd
      

      Dacht' ich auch :-( Ich arbeite in cygwin / win7pro

      Obs daran liegen könnt'?

      Peter

      1. Laut der Fehlermeldung No such file or directory hast Du ein nicht existierendes Verzeichnis angegeben.

  2. Hallo und guten Tag,

    b.sh:

    #!/bin/bash
    cd ..
    pwd
    

    Ergebnis:

    Peter@Peter ~
    $ ./b.sh
    : No such file or directory
    /home/Peter
    

    Warum funktioniert der Verzeichniswechsel nicht? Bzw., wie kann ich das verzeichnis wechseln?

    Darf der User, unter dem das Script läuft, denn das gewünschte Verzeichnis lesen?

    Grüße
    TS

    --
    es wachse der Freifunk
    http://freifunk-oberharz.de
    1. Darf der User, unter dem das Script läuft, denn das gewünschte Verzeichnis lesen?

      Wenn es /home ist sogar betreten ...

    2. Hallo,

      Peter@Peter ~
      $ ./b.sh
      : No such file or directory
      /home/Peter
      

      Warum funktioniert der Verzeichniswechsel nicht? Bzw., wie kann ich das verzeichnis wechseln?

      Darf der User, unter dem das Script läuft, denn das gewünschte Verzeichnis lesen?

      müsste die Meldung nicht ganz anders lauten, wenn er das nicht dürfte? Sowas wie "Permission denied"?

      So long,
       Martin

      --
      Es gibt eine Theorie, die besagt, dass das Universum augenblicklich durch etwas noch Komplizierteres und Verrücktes ersetzt wird, sobald jemand herausfindet, wie es wirklich funktioniert. Es gibt eine weitere Theorie, derzufolge das bereits geschehen ist.
      - (frei übersetzt nach Douglas Adams)
      1. müsste die Meldung nicht ganz anders lauten, wenn er das nicht dürfte? Sowas wie "Permission denied"?

        Ja.

  3. Ich habe das für Dich gegoogelt:

    http://superuser.com/questions/189259/cygwin-cd-in-bash-script

    Womöglich falsches Zeilenende.

    -> Versuchs mal mit cd ..; (Und beende, wenn das hilft, alle Befehle mit dem Semikolon.)

    1. Womöglich falsches Zeilenende.

      -> Versuchs mal mit cd ..;

      Hab ich auch schon gedacht und es so versucht. Leider unverändertes Ergebnis.

      Das Script führe ich in ./home/Peter aus. Insofern sollte es auch keine Rechteprobleme geben.

      Ich bin ratlos.

      Peter

      1. Das Script führe ich in ./home/Peter aus.

        Eher in /home/Peter;

        Versuche mal:

        #!/bin/bash
        cd $(pwd)/../;
        pwd
        
        1. Das Script führe ich in ./home/Peter aus.

          Eher in /home/Peter;

          Versuche mal:

          #!/bin/bash
          cd $(pwd)/../;
          pwd
          

          Die Zeilenumbrüche passen aber? Sind also LFs und keine CRLFs? Notfalls mal mit einem Hexeditor oder so ansehen.

          1. Versuche mal:

            #!/bin/bash
            cd $(pwd)/../;
            pwd
            

            Die Zeilenumbrüche passen aber? Sind also LFs und keine CRLFs? Notfalls mal mit einem Hexeditor oder so ansehen.

            Hatte ich schon geschrieben. Mit dem vorgeschlagenem Semikolon am Ende wird das obsolet.

            1. Hatte ich schon geschrieben.

              Ja, darauf bezog ich mich. Es scheint mir auch die plausible Ursache zu sein, da es auch ganz gut zur Fehlermeldung passt.

              Mit dem vorgeschlagenem Semikolon am Ende wird das obsolet.

              Ich würde es dennoch in jedem Fall überprüfen. Zumal das potenzielle CR auch mit Semikolon nicht aus der Datei verschwindet. Wer weiß, als was das dann interpretiert wird.

              1. Wer weiß, als was das dann interpretiert wird.

                Ich. Als Wagenrücklauf. Ein Drucker geht zum Anfang der Zeile ohne diese zu wechseln. Die Konsole/ das Terminal auch:

                Test:

                echo -en "Hallo\r";read a;
                

                Alternativ-Text

                "\r" ist als Bestandteil von Dateinamen unter Linux gültig, wird (aber anders als "\n", "\t", " " oder ";" - wo man das erzwingen muss!) also auch so interpretiert. Kommt hier das Semikolon davor, dann weiß die Shell/Bash: Das steht da nur so rum und wird wie jedes andere Space behandelt.

                1. "\r" ist als Bestandteil von Dateinamen unter Linux gültig, wird (aber anders als "\n", "\t", " " oder ";" - wo man das erzwingen muss!) also auch so interpretiert. Kommt hier das Semikolon davor, dann weiß die Shell/Bash: Das steht da nur so rum und wird wie jedes andere Space behandelt.

                  Das stimmt nicht, ich muss das korrigieren.

          2. Die Zeilenumbrüche passen aber? Sind also LFs und keine CRLFs? Notfalls mal mit einem Hexeditor oder so ansehen.

            Nein, die passen leider anscheinend nicht. ich hab die Datei mal mit VIM geöffnet. Ich kenne VIM nicht, aber es stand irgendwas daruznter, dass es sich um eine DOS Datei handelt. Ich denke also, dass jetzt meine Aufgabe ist, daraus eine Unixdatei zu machen. Ich schau mir mal VIM genauer an, der solgte das schaffen ;)

            Peter

            1. Ich denke also, dass jetzt meine Aufgabe ist, daraus eine Unixdatei zu machen.

              Entweder einen brauchbaren Editor benutzen (Notepad++ kann Unix-Zeilenenden) oder:

              dos2unix installieren und benutzen.

              1. dos2unix installieren und benutzen.

                Guter Tip, danke. hab ich gemacht und es klppt prima damit.

                Peter

            2. Nein, die passen leider anscheinend nicht. ich hab die Datei mal mit VIM geöffnet. Ich kenne VIM nicht, aber es stand irgendwas daruznter, dass es sich um eine DOS Datei handelt. Ich denke also, dass jetzt meine Aufgabe ist, daraus eine Unixdatei zu machen. Ich schau mir mal VIM genauer an, der solgte das schaffen ;)

              Das war das Problem. VIM hats geschafft, es zu lösen. Jetzt läufts. Danke für Eute Mithilfe

              Peter

  4. Tach!

    : No such file or directory

    Warum funktioniert der Verzeichniswechsel nicht? Bzw., wie kann ich das verzeichnis wechseln?

    Ich kann das Problem nicht nachvollziehen. Unter einer frischen cygwin-Installation läuft das ganz hervorragend, wenn man der b.sh Ausführungsrechte gibt.

    Bei mir lautet die Fehlermeldung bei nicht vorhandenem Verzeichnis:

    ./b.sh: line 2: cd: nichtda: No such file or directory

    Da ist zu sehen, dass sich die Meldung auf das cd im Batchfile bezieht und nicht auf irgendetwas anderes. Deine Ausgabe scheint mir manipuliert oder sich auf etwas anderes zu beziehen oder du hast irgendeine andere Installation.

    Eine nicht vorhandene Datei ergibt übrigens

    bash: ./c.sh: No such file or directory

    also auch mehr als nur einen Doppelpunkt am Anfang.

    dedlfix.

    1. Tach!

      Mit DOS-Zeilenenden wird es teilweise nachvollziehbar:

      : No such file or directory
      ./b.sh: line 3: $'pwd\r': command not found
      

      Aber da steht dann auch noch eine weitere Fehlermeldungszeile statt der Ausgabe des Verzeichnisses. Und die deutet auf den Zeilenende-Fehler hin.

      dedlfix.

      1. Mit DOS-Zeilenenden wird es teilweise nachvollziehbar:

        : No such file or directory
        ./b.sh: line 3: $'pwd\r': command not found
        

        Aber da steht dann auch noch eine weitere Fehlermeldungszeile statt der Ausgabe des Verzeichnisses. Und die deutet auf den Zeilenende-Fehler hin.

        Deswegen ja auch mein Rat, alle Befehle mit dem Semikolon zu beenden.

        1. Tach!

          Deswegen ja auch mein Rat, alle Befehle mit dem Semikolon zu beenden.

          Das klappt mit der Shebang nicht

          bash: ./b.sh: /bin/bash;^M: bad interpreter: No such file or directory

          Und wenn man die ohne Semikolon, aber mit DOS-Endung schreibt und die anderen Zeilen mit Semikolon und DOS-Endung, ergibt sich

          ./b.sh: line 2: $'\r': command not found
          /home
          ./b.sh: line 3: $'\r': command not found
          

          dedlfix.

          1. Tach!

            Das klappt mit der Shebang nicht

            Du hast recht. Es gibt aber für alles andere einen Trick:

            ~$ echo -e "echo \"hallo\";\r\n" > test.sh
            ~$ . test.sh 
            hallo
            : Befehl nicht gefunden.
            ~$ echo -e "echo \"hallo\";#\r\n" > test.sh
            ~$ . test.sh 
            hallo
            ~$        
            
    2. Mal ein Vergleich der Fehlermeldungen:

      bash:

      ~$ cd /foo
      bash: cd: /foo: Datei oder Verzeichnis nicht gefunden
      ./gibtsnich.sh
      bash: ./gibtsnich.sh: Datei oder Verzeichnis nicht gefunden
      

      sh:

      $ sh
      $ ./gibtsnich.sh
      sh: 1: ./gibtsnich.sh: not found
      $ cd /foo
      sh: 2: cd: can't cd to /foo
      

      Es kann auch sein, dass die shebang falsch ist. (Zeilenende?)

      test.sh:

      #!/bin/bashFehler
      pwd
      
      $ vi test.sh
      ~$ chmod 755 test.sh 
      ~$ ./test
      bash: ./test: Datei oder Verzeichnis nicht gefunden
      

      Wirft den gleichen Fehler.

      Skript mit aktueller Shell in aktueller Umgebung ausführen:

      . test.sh 
      /home/user
      bash: /home/user: Ist ein Verzeichnis
      

      Dann aber einen anderen.

      Deine Ausgabe scheint mir manipuliert

      Jepp.

      1. Deine Ausgabe scheint mir manipuliert

        Jepp.

        Klar. Ich wolt' Euch was beschäftigen. Spaß beiseite, ich habe gar nichts manipuliert. Ich habe aber von a.sh bis e.sh verschiedene Versuche durchgeführt, womöglich habe ich etwas durcheinandergewürfelt. Die Fehlermeldung

        ./c.sh: Zeile 2: $'\r': Kommando nicht gefunden.
        

        hatte ich zwischenzeitlich auch. Und daran lags schlussendlich wohl auch.

        In VIM neu an gelegt und danach noch die entsprechenden Rechte gesetzt, läuft das Script nun.

        Peter

        1. #!/bin/bash
          #File: ~/bin/myDos2Unix
          if [ -w "${1}" ]; then
              echo "Bereinige Datei \"${1}\"";
              tmpfile=$(mktemp);
              tr -d "\r" < "${1}" > ${tmpfile};
              rm $1;
              mv ${tmpfile} "${1}";
              echo "Erledigt.";
          else
              echo "Fatal: Datei \"${1}\" existiert nicht oder ist oder Sie haben keine Schreibrechte!"
          fi
          
          
          ~> chmod 755 ~/bin/myDos2Unix
          ~> myDos2Unix test.sh
          

          Downloadhätte es übrigens auch "getan".

          Download

          1. Wer die Datei herunter geladen hat, der sollte sich das Update antun.

            Vorteile:
            • mehrere Dateien übergebbar (auch *),
            • Dateien werden auf Inhaltstyp Text geprüft,
            • Rechte bleiben erhalten.

            aktuelle Version