Cygwin - cd em script bash


12

Eu sou novo no uso do Cygwin, então peço desculpas se esta for uma pergunta muito recente.

Eu tenho um script bash onde eu "cd" para um diretório e faço algo nesse diretório. No entanto, o comando cd falha com "Nenhum arquivo ou diretório / c / code / blah / blah".

Se eu copiar a linha do CD diretamente no prompt do shell, funcionará bem. Apenas falha no script.

[edit] Conforme solicitado, adicionei as linhas reais do script:

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

Obrigado por qualquer ajuda com isso,
Dan.


1
Você pode postar as linhas reais do script?
Pausado até novo aviso.

Respostas:


18

Que tipo de final de linha o seu script possui? Para que o script bash do Cygwin funcione corretamente (sem precisar definir opções especiais), ele deve ter terminações de linha Unix (LF) em vez de terminações de linha DOS (CR-LF). Se você salvou o script com as terminações de linha do DOS, o bash verá seu argumento cdcomo /c/Code/Project^M, onde ^Mé um CR, e não encontrará um diretório com esse nome.

Para ver que tipo de final de linha ela possui, você pode executar file scriptnameonde scriptname é o nome do seu script. Para converter o script para que ele tenha finais de linha Unix, execute d2u scriptname.

Não use o Bloco de notas para editar os scripts do Cygwin bash. Ele sempre salva arquivos com terminações de linha do DOS.


Aha! Foi isso. Eu estava usando o Vim para editá-lo. Obrigado :-)
Dan

Vim vai funcionar bem. Ele detecta automaticamente se os arquivos têm final de linha Unix ou DOS e os salva da mesma maneira. Por padrão, o vim do Cygwin criará novos arquivos com finais de linha Unix, mas o gvim do Windows criará um novo arquivo com finais de linha do DOS. Você pode mudar isso. Veja :help ffe :help ffs.
garyjohn

O Emacs também estava economizando com o CR-LF. Alterando o estilo de final de linha no editor: emacswiki.org/emacs/EndOfLineTips
jfklein

3

A menos que você substitua, um script é executado em sua própria cópia do shell (geralmente Bash). Então, quando o script termina, a instância do bash também sai. Assim, os CDs do seu script são inseridos em um novo diretório e, em seguida, são encerrados, retornando ao Bash original - que nunca foi lançado.

Duas maneiras de contornar isso. Você pode usar um alias em vez de um script, por exemplo, no seu .profile

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

Outra maneira é dizer ao Bash para não gerar um subshell usando a sintaxe "ponto"

. myscript

Você interpretou mal minha pergunta. A mensagem de erro sobre a qual perguntei é gravada no stdout pelo comando cd, que está dentro do script. Não estou pedindo que o diretório atual tenha sido alterado assim que o script terminar.
Dan

Eu tive um problema semelhante ao OP, mas sem erros; esta resposta me ajudou muito, mesmo que não seja "100% no tópico".
Frosty Z


1

Experimentar:

cd /cygdrive/c/code/blah/blah


Isso funcionará para 'cd c:/code/blah/blah'não para 'cd /c/code/blah/blah'. Além disso, o c:formulário ' ' também funciona a partir de um script; Algo está faltando aqui, a questão precisa de mais elaboração.
N16

Isso não funcionou.
Dan

@nik oc: formulário também não funcionou. Nada do que tento funciona a partir de um script. Todos eles trabalham na linha de comando.
Dan

1

Não tenho reputação de comentar ou votar, mas a resposta de CarlF me ajudou.

"Então, seus CDs de script são inseridos em um novo diretório e, em seguida, saem, retornando ao Bash original - que nunca foi lançado."

Mesmo script, mas no meu caso, nenhuma mensagem de erro.

Isso funcionou para mim:

. myscript.sh

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.