Cygwin - cd en script bash


12

Je suis nouveau dans l'utilisation de Cygwin, donc veuillez m'excuser s'il s'agit d'une question très novice.

J'ai un script bash où je "cd" dans un répertoire puis fais quelque chose dans ce répertoire. Cependant, la commande cd échoue avec "Aucun fichier ou répertoire / c / code / blah / blah".

Si je copie la ligne de CD directement dans l'invite du shell, cela fonctionne bien. Il échoue simplement dans le script.

[modifier] Comme demandé, j'ai ajouté les lignes réelles du script:

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

Merci pour toute aide à ce sujet,
Dan.


1
Pouvez-vous publier la ou les lignes réelles du script?
pause jusqu'à nouvel ordre.

Réponses:


18

De quel type de fins de ligne dispose votre script? Pour que le script bash Cygwin fonctionne correctement (sans avoir à définir d'options spéciales), il doit avoir des fins de ligne Unix (LF) plutôt que des fins de ligne DOS (CR-LF). Si vous avez enregistré le script avec des fins de ligne DOS, bash verra votre argument cdcomme as /c/Code/Project^M, où ^Mest un CR et ne trouvera pas de répertoire de ce nom.

Pour voir quel type de fins de ligne il a, vous pouvez l'exécuter file scriptname, où scriptname est le nom de votre script. Pour convertir le script afin qu'il ait des fins de ligne Unix, exécutez d2u scriptname.

N'utilisez pas le Bloc-notes pour modifier les scripts bash Cygwin. Il enregistre toujours les fichiers avec des fins de ligne DOS.


Ah! C'était ça. J'utilisais Vim pour le modifier. Merci :-)
Dan

Vim fonctionnera bien. Il détecte automatiquement si les fichiers ont des fins de ligne Unix ou DOS et les enregistre de la même manière. Par défaut, le vim de Cygwin créera de nouveaux fichiers avec des fins de ligne Unix, mais le gvim de Windows créera un nouveau fichier avec des fins de ligne DOS. Tu peux changer ça. Voir :help ffet :help ffs.
garyjohn

Emacs économisait également avec CR-LF. Modification du style de fin de ligne dans l'éditeur: emacswiki.org/emacs/EndOfLineTips
jfklein

3

Sauf si vous remplacez, un script s'exécute dans sa propre copie du shell (généralement Bash). Ensuite, lorsque le script se termine, cette instance de bash se ferme également. Donc, vos CD de script dans un nouveau répertoire, puis se termine, vous ramenant au Bash d'origine - qui n'a jamais fait de CD.

Deux façons de contourner ce problème. Vous pouvez utiliser un alias au lieu d'un script, par exemple dans votre .profile have

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

Une autre façon est de dire à Bash de ne pas générer de sous-shell en utilisant la syntaxe "dot"

. myscript

Vous avez mal lu ma question. Le message d'erreur que j'ai demandé est écrit dans la sortie standard par la commande cd, qui se trouve dans le script. Je ne demande pas que le répertoire courant ait été changé une fois le script terminé.
Dan

J'ai eu un problème similaire à l'OP mais sans erreur; cette réponse m'a beaucoup aidé, même si ce n'est pas "100% sur le sujet".
Frosty Z


1

Essayer:

cd /cygdrive/c/code/blah/blah


Cela fonctionnera pour 'cd c:/code/blah/blah«pas pour 'cd /c/code/blah/blah». De plus, le c:formulaire ' ' fonctionne également à partir d'un script; Il manque autre chose ici, la question a besoin de plus de détails.
nik

Ça n'a pas marché.
Dan

@nik the c: form ne fonctionnait pas non plus. Rien de ce que j'essaie ne fonctionne à partir d'un script. Ils fonctionnent tous à partir de la ligne de commande.
Dan

1

Je n'ai pas la réputation de commenter ou de voter, mais la réponse de CarlF m'a aidé.

"Donc, vos CD de script dans un nouveau répertoire, puis se termine, vous ramenant au Bash d'origine - qui n'a jamais fait de CD."

Même script, mais dans mon cas, pas de message d'erreur.

Cela a fonctionné pour moi:

. myscript.sh

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.