なぜcd
がシェルスクリプトで機能しないのかと思います。以下の通りです、
#!/bin/sh
cd test
mkdir $(date +%d-%mm-%Y)
これを実行すると、CDをテストできません
cd: 2: can't cd to /test
なぜこんな感じ?
私も同じ問題を抱えていました。問題は\ r\n行末であることが判明しました。
それを修正するには、
tr -d "\r" < oldname.sh > newname.sh
から http://talk.maemo.org/showthread.php?s=1cadd53b369d5408c2b9d53580a32dc4&t=67836&page=2
この質問にはあまり関係ありません。同じエラーメッセージが表示されましたが、使用していた
cd ~/foo/bar
これを変更した後
cd $HOME/foo/bar
修正されました。
最初の行としてpwd
を置きます。次に、そのディレクトリにテストサブディレクトリがあるかどうかを確認します。
ルートディレクトリから実行されているようです
私にはこの問題があり、しばらく混乱していました。
$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つのケースでは、CDPATH
and現在のディレクトリの両方を検索しますが、スクリプトではonlyはCDPATH
を検索します。これは、PATH
の動作に似ています。 PATH
に.
(現在のディレクトリ)を残した場合、そのファイルを実行するには、localbinary
だけでなく./localbinary
と入力する必要があります。
これは私の教育を受けた推測です。 CDPATH
を設定または設定解除すると、cd subdir
コマンドが中断または解除され、cd ./subdir
がすべての場合に機能します。
Benito Ciaro による答えは適切です。 \r\n
行末を削除するために使用できる別のメソッドを追加したいと思います。スクリプトをテキストエディターSublimeおよびメニューで開きます
移動表示→行末→Unix
これにより、スクリプトから「\ r」文字が削除されます。ファイルを保存することを忘れないでください。
「」を使ってうまくいきました
したがって、あなたの場合は次のようになります:
cd "test"
/マーカス
これは、スクリプトの実行元によって異なります。スクリプトが$ PATHにある場合、コマンドを実行した現在のディレクトリ(作業ディレクトリ)に基づいています。
これがcronジョブとして実行されているスクリプトの場合は、完全なディレクトリパスを使用するのが最善です。
例:
cd/home/user/test
フルパスを指定しても、スクリプトが$ PATHにある場合は機能します。
2
は、「そのようなファイルまたはディレクトリはありません」のerrnoです。スクリプトtest
はスクリプトの作業ディレクトリに存在しますか?
最初にknown "good"ディレクトリにcd
し、次にcdしてknownその適切なディレクトリの子ディレクトリに移動します。
私はubuntuでも同じ問題に直面しました。私のコマンドシェルは:
$ export DIR=mydir
次に、以下を含むスクリプトファイルを実行します。
#!/bin/sh
cd ~/$DIR
出力を与える:
cd: 2: can't cd to ~/mydir
多くのオプションを試してみると、最終的には次のようにしか解決できません。
#!/bin/sh
WORKDIR=~/$DIR
cd "$WORKDIR"
使ってはいけない
cd /test
代わりに?シェルスクリプトはわかりませんが、特定のスクリプトは現在のディレクトリに依存していることがわかります。