Cygwin-bashスクリプトのCD


12

Cygwinを使用するのは初めてなので、これが非常に初心者の質問である場合はおaびします。

ディレクトリに「cd」して、そのディレクトリで何かをするbashスクリプトがあります。ただし、cdコマンドは「No such file or directory / c / code / blah / blah」で失敗します。

cd行をシェルプロンプトに直接コピーすると、正常に機能します。スクリプトで失敗するだけです。

[編集]要求に応じて、スクリプトから実際の行を追加しました。

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

これについてご協力いただきありがとうございます、
ダン。


1
スクリプトから実際の行を投稿できますか?
追って通知があるまで一時停止します。

回答:


18

スクリプトにはどのような行末がありますか?Cygwin bashスクリプトが(特別なオプションを設定せずに)適切に動作するためには、DOS行末(CR-LF)ではなくUnix行末(LF)が必要です。あなたはDOSの行末でスクリプトを保存した場合、bashはあなたに引数が表示されますcdよう/c/Code/Project^Mところ、^MCRであり、その名前のディレクトリを見つけることができません。

それは、あなたが実行できている行末の種類を確認するにはfile scriptnameどこ、スクリプト名はスクリプトの名前です。Unixの行末を含むようにスクリプトを変換するには、を実行しd2u scriptnameます。

Cygwin bashスクリプトの編集にメモ帳を使用しないでください。常にDOS行末でファイルを保存します。


あぁ!それでした。Vimを使用して編集していました。ありがとう:
ダン

Vimは正常に動作します。ファイルにUnixまたはDOSの行末があるかどうかを自動的に検出し、同じ方法で保存します。デフォルトでは、CygwinのvimはUnix行末で新しいファイルを作成しますが、WindowsのgvimはDOS行末で新しいファイルを作成します。あなたはそれを変えることができます。:help ffおよびを参照してください:help ffs
ゲイリージョン

EmacsもCR-LFで保存していました。エディターの行末
jfklein

3

上書きしない限り、スクリプトは独自のシェルのコピー(通常はBash)で実行されます。その後、スクリプトが終了すると、bashのインスタンスも終了します。したがって、スクリプトCDを新しいディレクトリに入れてから終了し、元のBashに戻ります。

それを回避する2つの方法。スクリプトの代わりにエイリアスを使用できます。たとえば、.profileで

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

別の方法は、「ドット」構文を使用してサブシェルを生成しないようにBashに指示することです

. myscript

あなたは私の質問を読み違えました。私が尋ねたエラーメッセージは、スクリプト内のcdコマンドによってstdoutに書き込まれます。スクリプトが終了したら、現在のディレクトリを変更することを求めていません。
ダン

私はOPと同様の問題を抱えていましたが、エラーはありませんでした。「100%オントピック」ではない場合でも、この回答は非常に役立ちました。
フロスティZ


1

試してください:

cd /cygdrive/c/code/blah/blah


これは'cd c:/code/blah/blah「ではなく'cd /c/code/blah/blah」で機能します。また、 ' c:'フォームもスクリプトから機能します。ここでは他に何かが欠けています。質問にはさらに詳しく説明する必要があります。
nik

これはうまくいきませんでした。
ダン

@nik the c:フォームも機能しませんでした。私が試したものは、スクリプトでは機能しません。それらはすべてコマンドラインから機能します。
ダン

1

コメントしたり投票したりする評判はありませんが、CarlFの答えが役に立ちました。

「つまり、スクリプトCDを新しいディレクトリに入れてから終了し、元のBashに戻ります。

同じスクリプトですが、私の場合、エラーメッセージはありません。

これは私のために働いた:

。myscript.sh

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.