Cygwin - cd en script bash

12

Soy nuevo en el uso de Cygwin, así que me disculpo si esta es una pregunta muy nueva.

Tengo un script bash donde "cd" a un directorio y luego hago algo en ese directorio. Sin embargo, el comando cd falla con "No existe dicho archivo o directorio / c / code / blah / blah".

Si copio la línea de CD directamente en el indicador de comandos de shell, entonces funciona bien. Simplemente falla en el guión.

[editar] Según lo solicitado, agregué las líneas reales del script:

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

Gracias por cualquier ayuda con esto,
Dan.

Dan
fuente
1
¿Puedes publicar las líneas reales del guión?
Dennis Williamson

Respuestas:

18

¿Qué tipo de terminaciones de línea tiene su script? Para que el script de Cygwin bash funcione correctamente (sin tener que establecer opciones especiales), debe tener terminaciones de línea Unix (LF) en lugar de terminaciones de línea DOS (CR-LF). Si guardó el script con terminaciones de línea de DOS, bash verá su argumento cdcomo /c/Code/Project^M, donde ^Mhay un CR, y no encontrará un directorio con ese nombre.

Para ver qué tipo de terminaciones de línea tiene, puede ejecutar file scriptname, donde scriptname es el nombre de su script. Para convertir el script de modo que tenga terminaciones de línea Unix, ejecute d2u scriptname.

No use el Bloc de notas para editar scripts de Cygwin bash. Siempre guarda archivos con terminaciones de línea de DOS.

garyjohn
fuente
¡Ajá! Eso fue todo. Estaba usando Vim para editarlo. Gracias :-)
Dan
Vim funcionará bien. Detecta automáticamente si los archivos tienen terminaciones de línea Unix o DOS y los guardará de la misma manera. Por defecto, el vim de Cygwin creará nuevos archivos con terminaciones de línea Unix, pero el gvim de Windows creará un nuevo archivo con terminaciones de línea DOS. Puedes cambiar eso. Ver :help ffy :help ffs.
garyjohn
Emacs también estaba ahorrando con CR-LF. Cambio del estilo de final de línea en el editor: emacswiki.org/emacs/EndOfLineTips
jfklein
2

A menos que anule, un script se ejecuta en su propia copia del shell (generalmente Bash). Luego, cuando sale el script, también sale esa instancia de bash. Por lo tanto, sus CDs de script en un nuevo directorio y luego salen, regresando al Bash original, que nunca hizo un CD.

Dos formas de solucionarlo. Puede usar un alias en lugar de un script, por ejemplo, en su .profile tiene

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

Otra forma es decirle a Bash que no genere una subshell utilizando la sintaxis "dot"

. myscript
CarlF
fuente
Has leído mal mi pregunta. El mensaje de error que pregunté está escrito en el stdout por el comando cd, que está dentro del script. No estoy pidiendo que el directorio actual se haya cambiado una vez que se cierra el script.
Dan
Tuve un problema similar al OP pero sin error; esta respuesta me ayudó mucho, incluso si no es "100% sobre el tema".
Frosty Z
2

Puede encontrar sus archivos en / cygdrive / c ...

Xenoactive
fuente
1

Tratar:

cd /cygdrive/c/code/blah/blah

Mike Fitzpatrick
fuente
Eso funcionará para 'cd c:/code/blah/blah'no para 'cd /c/code/blah/blah'. Además, la forma ' c:' también funciona desde un script; Aquí falta algo más, la pregunta necesita más elaboración.
Nik
Esto no funcionó.
Dan
@nik the c: form tampoco funcionó. Nada de lo que intento funciona de un script. Todos trabajan desde la línea de comando.
Dan
1

No tengo reputación para comentar o votar, pero la respuesta de CarlF me ayudó.

"De modo que el CD de la secuencia de comandos se inserta en un nuevo directorio y luego sale, regresando al Bash original, que nunca hizo un CD".

El mismo script, pero en mi caso, no hay mensaje de error.

Esto funcionó para mí:

. myscript.sh

PJ Brunet
fuente