web-dev-qa-db-ja.com

「cd」がシェルスクリプトで機能しない

なぜcdがシェルスクリプトで機能しないのかと思います。以下の通りです、

#!/bin/sh
cd test
mkdir $(date +%d-%mm-%Y)

これを実行すると、CDをテストできません

cd: 2: can't cd to /test

なぜこんな感じ?

30
Abhishek

私も同じ問題を抱えていました。問題は\ r\n行末であることが判明しました。

それを修正するには、

tr -d "\r" < oldname.sh > newname.sh

から http://talk.maemo.org/showthread.php?s=1cadd53b369d5408c2b9d53580a32dc4&t=67836&page=2

45
Benito Ciaro

この質問にはあまり関係ありません。同じエラーメッセージが表示されましたが、使用していた

cd ~/foo/bar

これを変更した後

cd $HOME/foo/bar

修正されました。

4

最初の行としてpwdを置きます。次に、そのディレクトリにテストサブディレクトリがあるかどうかを確認します。

ルートディレクトリから実行されているようです

3
Foo Bah

私にはこの問題があり、しばらく混乱していました。

$CDPATH環境変数を設定したことがわかりました。これにより、通常、通常のcdコマンドが通常どおりに機能します。ただし、スクリプトを「bash」ではなく「sh」として非対話モードで実行しており、動作が少し異なります。次のようなコマンドのようです:

cd subdir  # works via interactive bash; not in script run via sh.

CDPATHが設定されている場合でも、インタラクティブログインシェル、bashで期待どおりに動作します。しかし、(shを使用して)スクリプトで同じコマンドを実行すると、

myscript.sh: line 9: cd: subdir: No such file or directory

相対パスになるように変更しました。

cd ./subdir

そしてそれはうまくいきます!違いは、シェルがCDPATHを使用する方法にあると思います。 1つのケースでは、CDPATHand現在のディレクトリの両方を検索しますが、スクリプトではonlyCDPATHを検索します。これは、PATHの動作に似ています。 PATH.(現在のディレクトリ)を残した場合、そのファイルを実行するには、localbinaryだけでなく./localbinaryと入力する必要があります。

これは私の教育を受けた推測です。 CDPATHを設定または設定解除すると、cd subdirコマンドが中断または解除され、cd ./subdirがすべての場合に機能します。

3
Tyler

Benito Ciaro による答えは適切です。 \r\n行末を削除するために使用できる別のメソッドを追加したいと思います。スクリプトをテキストエディターSublimeおよびメニューで開きます

移動表示→行末→Unix

これにより、スクリプトから「\ r」文字が削除されます。ファイルを保存することを忘れないでください。

2
Abhinav Gupta

「」を使ってうまくいきました

したがって、あなたの場合は次のようになります:

cd "test"

/マーカス

1
Oldek

これは、スクリプトの実行元によって異なります。スクリプトが$ PATHにある場合、コマンドを実行した現在のディレクトリ(作業ディレクトリ)に基づいています。

これがcronジョブとして実行されているスクリプトの場合は、完全なディレクトリパスを使用するのが最善です。
例:
cd/home/user/test

フルパスを指定しても、スクリプトが$ PATHにある場合は機能します。

0
KazW

2は、「そのようなファイルまたはディレクトリはありません」のerrnoです。スクリプトtestはスクリプトの作業ディレクトリに存在しますか?

最初にknown "good"ディレクトリにcdし、次にcdしてknownその適切なディレクトリの子ディレクトリに移動します。

0
Matthew Iselin

私はubuntuでも同じ問題に直面しました。私のコマンドシェルは:

$ export DIR=mydir

次に、以下を含むスクリプトファイルを実行します。

#!/bin/sh
cd ~/$DIR

出力を与える:

cd: 2: can't cd to ~/mydir

多くのオプションを試してみると、最終的には次のようにしか解決できません。

#!/bin/sh
WORKDIR=~/$DIR
cd "$WORKDIR"
0
Chetabahana

使ってはいけない

cd /test

代わりに?シェルスクリプトはわかりませんが、特定のスクリプトは現在のディレクトリに依存していることがわかります。

0
Kevin A. Naudé