Cygwin - cd in script bash


12

Sono nuovo nell'uso di Cygwin, quindi mi scuso se questa è una domanda molto nuova.

Ho uno script bash in cui "cd" in una directory quindi faccio qualcosa in quella directory. Tuttavia, il comando cd ha esito negativo con "Nessun file o directory / c / code / blah / blah".

Se copio la linea cd direttamente nel prompt della shell, allora funziona benissimo. Fallisce semplicemente nella sceneggiatura.

[modifica] Come richiesto, ho aggiunto le righe effettive dallo script:

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

Grazie per l'aiuto,
Dan.


1
Puoi pubblicare le righe effettive dallo script?
In pausa fino a ulteriore avviso.

Risposte:


18

Che tipo di terminazioni di riga ha la tua sceneggiatura? Perché Cygwin bash script funzioni correttamente (senza dover impostare opzioni speciali), deve avere terminazioni di linea Unix (LF) anziché terminazioni di riga DOS (CR-LF). Se hai salvato lo script con terminazioni di riga DOS, bash vedrà il tuo argomento in cdas /c/Code/Project^M, where ^Mis a CR, e non troverà una directory con quel nome.

Per vedere che tipo di terminazioni di riga ha, puoi eseguire file scriptname, dove scriptname è il nome del tuo script. Per convertire lo script in modo che abbia terminazioni di linea Unix, eseguire d2u scriptname.

Non usare Blocco note per modificare gli script di Basg di Cygwin. Salva sempre i file con terminazioni di riga DOS.


Aha! Questo è stato. Stavo usando Vim per modificarlo. Grazie :-)
Dan,

Vim funzionerà benissimo. Rileva automaticamente se i file hanno terminazioni di linea Unix o DOS e li salverà allo stesso modo. Per impostazione predefinita, vim di Cygwin creerà nuovi file con terminazioni di linea Unix, ma gvim di Windows creerà nuovi file con terminazioni di linea DOS. Puoi cambiarlo. Vedi :help ffe :help ffs.
garyjohn,

Emacs stava risparmiando anche con CR-LF. Modifica dello stile di fine riga nell'editor: emacswiki.org/emacs/EndOfLineTips
jfklein

3

A meno che non si esegua l'override, uno script viene eseguito nella propria copia della shell (di solito Bash). Quindi quando esce lo script, esce anche quell'istanza di bash. Quindi i tuoi script copiano un CD in una nuova directory e poi si chiudono, riportandoti al Bash originale, che non ha mai fatto un CD.

Due modi per aggirare il problema. Puoi usare un alias invece di uno script, ad esempio nel tuo .profile

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

Un altro modo è di dire a Bash di non generare una subshell usando la sintassi "punto"

. myscript

Hai letto male la mia domanda. Il messaggio di errore che ho chiesto è scritto sullo stdout dal comando cd, che si trova all'interno dello script. Non sto chiedendo che la directory corrente sia stata modificata una volta terminato lo script.
Dan,

Ho avuto un problema simile al PO ma senza errori; questa risposta mi ha aiutato molto, anche se non è "al 100% in tema".
Frosty Z,


1

Provare:

cd /cygdrive/c/code/blah/blah


Funzionerà per 'cd c:/code/blah/blah"non per 'cd /c/code/blah/blah". Inoltre, il c:modulo ' ' funziona anche da uno script; Qualcos'altro manca qui, la domanda ha bisogno di più elaborazione.
nik,

Questo non ha funzionato.
Dan,

@nik the c: form non ha funzionato neanche. Nulla di ciò che provo funziona da una sceneggiatura. Funzionano tutti dalla riga di comando.
Dan,

1

Non ho la reputazione di commentare o votare, ma la risposta di CarlF mi ha aiutato.

"Quindi i tuoi script copiano un CD in una nuova directory e poi escono, riportandoti al Bash originale, che non ha mai fatto un CD."

Stesso script, ma nel mio caso, nessun messaggio di errore.

Questo ha funzionato per me:

. myscript.sh

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.