Cygwin - CD im Bash-Skript

12

Ich bin neu in der Verwendung von Cygwin, daher entschuldige ich mich, wenn dies eine sehr neue Frage ist.

Ich habe ein Bash-Skript, in dem ich ein Verzeichnis "cd" und dann etwas in diesem Verzeichnis tue. Der Befehl cd schlägt jedoch mit "Keine solche Datei oder kein solches Verzeichnis / c / code / blah / blah" fehl.

Wenn ich die CD-Zeile direkt in die Shell-Eingabeaufforderung kopiere, funktioniert es einwandfrei. Es schlägt nur im Skript fehl.

[edit] Wie gewünscht habe ich die aktuellen Zeilen aus dem Skript hinzugefügt:

#!/bin/bash
cd /c/Code/Project

Vielen Dank für jede Hilfe,
Dan.

Dan
quelle
1
Können Sie die tatsächlichen Zeilen aus dem Skript posten?
Bis auf weiteres angehalten.

Antworten:

18

Welche Art von Zeilenenden hat Ihr Skript? Damit das Cygwin-Bash-Skript ordnungsgemäß funktioniert (ohne dass spezielle Optionen festgelegt werden müssen), muss es über Unix-Zeilenenden (LF) und nicht über DOS-Zeilenenden (CR-LF) verfügen. Wenn Sie das Skript mit DOS-Zeilenenden gespeichert haben, sieht Bash Ihr Argument cdals /c/Code/Project^M, wo ^Msich ein CR befindet, und findet kein Verzeichnis mit diesem Namen.

Um zu sehen, welche Art von Zeilenenden es gibt, können Sie ausführen file scriptname, wobei scriptname der Name Ihres Skripts ist. Führen Sie Folgendes aus, um das Skript so zu konvertieren, dass es Unix-Zeilenenden aufweist d2u scriptname.

Verwenden Sie den Editor nicht zum Bearbeiten von Cygwin-Bash-Skripten. Es werden immer Dateien mit DOS-Zeilenenden gespeichert.

garyjohn
quelle
Aha! Das war's. Ich habe es mit Vim bearbeitet. Vielen Dank :-)
Dan
Vim wird gut funktionieren. Es erkennt automatisch, ob Dateien Unix- oder DOS-Zeilenenden haben und speichert sie auf die gleiche Weise. Standardmäßig erstellt Cygwins vim neue Dateien mit Unix-Zeilenenden, während Windows gvim neue Dateien mit DOS-Zeilenenden erstellt. Das können Sie ändern. Siehe :help ffund :help ffs.
Garyjohn
Emacs sparte auch mit CR-LF. Ändern des Zeilenende-Stils im Editor: emacswiki.org/emacs/EndOfLineTips
jfklein
3

Sofern Sie dies nicht überschreiben, wird ein Skript in einer eigenen Kopie der Shell (normalerweise Bash) ausgeführt. Wenn das Skript beendet wird, wird auch diese Bash-Instanz beendet. Also werden Ihre Skript-CDs in ein neues Verzeichnis verschoben und dann beendet. Sie kehren zum ursprünglichen Bash zurück - der noch nie eine CD erstellt hat.

Es gibt zwei Möglichkeiten, dies zu umgehen. Sie können einen Alias ​​anstelle eines Skripts verwenden, zB in Ihrem .profile haben

alias mycd="cd /c/Code/Project"

Eine andere Möglichkeit besteht darin, Bash mit der "Punkt" -Syntax anzuweisen, keine Subshell zu erzeugen

. myscript
CarlF
quelle
Sie haben meine Frage falsch verstanden. Die Fehlermeldung, nach der ich gefragt habe, wird vom Befehl cd, der sich im Skript befindet, in die Datei stdout geschrieben. Ich möchte nicht, dass das aktuelle Verzeichnis geändert wird, sobald das Skript beendet wird.
Dan,
Ich hatte ein ähnliches Problem wie das OP, aber ohne Fehler. Diese Antwort hat mir sehr geholfen, auch wenn sie nicht zu 100% thematisch ist.
Frosty Z
2

Möglicherweise finden Sie Ihre Dateien in / cygdrive / c ...

Xenoaktiv
quelle
1

Versuchen:

cd /cygdrive/c/code/blah/blah

Mike Fitzpatrick
quelle
Das funktioniert für 'cd c:/code/blah/blah"nicht für 'cd /c/code/blah/blah". Das ' c:' Formular funktioniert auch über ein Skript. Hier fehlt noch etwas anderes, die Frage bedarf einer genaueren Ausarbeitung.
Nik
Das hat nicht funktioniert.
Dan,
@nik das c: form hat auch nicht funktioniert. Nichts, was ich versuche, funktioniert über ein Skript. Sie arbeiten alle über die Befehlszeile.
Dan,
1

Ich habe keinen Ruf für Kommentare oder Abstimmungen, aber die Antwort von CarlF hat mir geholfen.

"Also werden Ihre Skript-CDs in ein neues Verzeichnis verschoben und dann beendet. Sie kehren zum ursprünglichen Bash zurück - der noch nie eine CD erstellt hat."

Gleiches Skript, aber in meinem Fall keine Fehlermeldung.

Das hat bei mir funktioniert:

. myscript.sh

PJ Brunet
quelle