2017-06-23 8 views
1

以下は、私が試みているより大きいスクリプトのスニペットです。私はこの部分に引数がディレクトリであることを認識させ、そのディレクトリにcdします。すなわち、./larj/etcです。初心者:ディレクトリを変更するスクリプト

#!/bin/ksh 
# Filename: larj.sh 

if [ $# -gt 1 ]; then 
    echo "0 or 1 arguments allowed." 
    exit 
fi 
if [ -f "$1" ]; then 
    echo "directory only." 
    exit 
else 
    if [ -d "$1" ]; then 
     cd $1 
    fi 
fi 

引数として/ etcを使用してスクリプトを実行すると、何も起こりません。それはエラーなしで同じディレクトリにとどまります。 ディレクトリを変更する方法を教えてください。

おかげ

+0

単に 'cd'を使うことはできませんか? – mkrieger1

+0

[cdがbashシェルスクリプトで動作しないのはなぜですか?](https://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-bash-shell-script) ) – mkrieger1

答えて

-1

あなたがcd働くことができない理由の問題は、あなたが./larj /etcとしてスクリプトを実行するときcdsub-shellで実行されるということです。したがって、スクリプトを実行すると、サブシェルの作業ディレクトリが変更され、現在のシェルに影響はありません。

したがって、. ./larj /etcとして実行できます。

Why doesn't “cd” work in a bash shell script?を参照してください。

+0

それは理にかなっています - サブシェル。私が言及したように、これはより大きいスクリプトの単なるスニペットです。だから、スニペットは大丈夫です。それを大きなスクリプトに追加すると、引数のディレクトリにcdして、その関数を実行し、私が働いているシェルで結果を返します。それは正確ですか? – T2true

+0

@ T2true。はい、うまくいきます。 testディレクトリが存在するかどうかを確認する 'cd/tmp && mkdir -p test'だけを含む小さなbashスクリプトでテストすることができます。それがうまくいくことがわかります。 – zhenguoli

1

cdは、スクリプトのシェル内で発生しています。

スクリプトが終了すると、シェルが終了し、スクリプトを実行する前にディレクトリに戻ります。ディレクトリを変更するには

mkdir testdir 
. ./your_script.sh testdir 

スクリプトの最後に、testdirというディレクトリに移動します。