Cygwin-bash脚本中的cd


12

我是使用Cygwin的新手,所以很抱歉,如果这是一个非常新手的问题。

我有一个bash脚本,在这里我可以“ cd”到目录,然后在该目录中执行某些操作。但是,cd命令失败,并显示“没有这样的文件或目录/ c / code / blah / blah”。

如果我将cd行直接复制到shell提示符下,则可以正常工作。它只是在脚本中失败。

[edit]根据要求,我从脚本中添加了实际的行:

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

谢谢您的帮助,
丹,


1
您可以从脚本中发布实际的行吗?
暂停,直到另行通知。

Answers:


18

您的脚本有什么样的行尾?为了使Cygwin bash脚本正常运行(无需设置特殊选项),它必须具有Unix行尾(LF),而不是DOS行尾(CR-LF)。如果您保存的脚本以DOS行结尾,则bash会将您的参数显示cd/c/Code/Project^M,其中^M为CR,并且找不到该名称的目录。

要查看它具有哪种类型的行尾,可以执行file scriptname,其中scriptname是脚本的名称。要转换脚本使其具有Unix行结尾,请执行d2u scriptname

不要使用记事本编辑Cygwin bash脚本。它始终以DOS行结尾保存文件。


啊哈!就是这样 我正在使用Vim进行编辑。谢谢:-)

Vim可以正常工作。它会自动检测文件是否以Unix或DOS行结尾,并以相同的方式保存它们。默认情况下,Cygwin的vim将创建带有Unix行尾的新文件,而Windows的gvim将创建带有DOS行尾的新文件。您可以更改它。请参阅:help ff:help ffs
garyjohn

Emacs还通过CR-LF进行了保存。更改编辑器中的行尾样式:emacswiki.org/emacs/EndOfLineTips
jfklein 2014年

3

除非您重写,否则脚本将在其自己的Shell副本(通常是Bash)中执行。然后,当脚本退出时,该bash实例也退出。因此,您的脚本CD进入了一个新目录,然后退出,使您返回到原始的Bash(从未使用过CD)。

解决它的两种方法。您可以使用别名代替脚本,例如,在.profile中有

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

另一种方法是通过使用“点”语法告诉Bash不要产生子shell。

. myscript

您看错了我的问题。我询问的错误消息是通过脚本中的cd命令写入stdout的。脚本退出后,我不要求更改当前目录。

我和OP有类似的问题,但是没有错误; 即使不是“ 100%主题”,此答案对我也有很大帮助。
Frosty Z


1

尝试:

cd /cygdrive/c/code/blah/blah


这将适用于'cd c:/code/blah/blah“不适用于'cd /c/code/blah/blah”。同样,' c:'形式也可以通过脚本运行;这里缺少其他内容,这个问题需要更多阐述。
尼克2010年

这没用。

@nik c:表单也不起作用。我没有尝试通过脚本执行任何操作。它们都从命令行工作。

1

我没有发表评论或投票的声誉,但是CarlF的回答帮助了我。

“因此,您的脚本CD进入了一个新目录,然后退出,使您返回到原始的Bash,而CD从未使用过。”

相同的脚本,但就我而言,没有错误消息。

这为我工作:

。myscript.sh

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.