スクリプト内でディレクトリを変更してもディレクトリが変更されないのはなぜですか?

スクリプト内でディレクトリを変更してもディレクトリが変更されないのはなぜですか?

私は見たこの答えこれを探して以来、最初にこのスクリプトを書きました:

for i in `seq 1 $1`; 
   do cd ../;
done;

ディレクトリを変更しません。なぜ、

./updir.sh 5

答え1

示されているようにスクリプトを実行すると、サブシェルにコピーされた環境が作成され、ディレクトリや環境変数の設定などの変更は、呼び出し元のシェルではなく、このサブシェル環境にのみ影響します。

スクリプトから現在のシェルに変更を加えるには、sourceまたは.コマンドを使用して現在のシェル内でスクリプトを実行する必要があります。

. ./updir.sh 5

エイリアスを使用するとこれを自動化できます。

alias updir='. ./updir.sh'

あるいは、スクリプトの代わりに関数を使用することもできます。

updir()
{   for i in `seq 1 $1`; 
       do cd ../;
    done
}

答え2

スクリプトはサブシェルで実行されるため、現在の作業ディレクトリを個別に追跡します。最も簡単な解決策は、関数を使用することです。

function updir() {
  for i in $(seq 1 $1); do
    cd ..
  done
}

関連情報