2

たとえば、tmpというディレクトリがあり、ホームディレクトリにいるとします。

$pwd
/my/home/directory/
$ls
tmpdir

「tmp」ディレクトリにcdするtmp.shがあります

#!/bin/bash
cd tmp

そして私は以下を使用してスクリプトを実行します:

$sh tmp.sh

このスクリプトを実行した後、私はまだホームディレクトリにいます。

1)これが完全に機能しない理由を理解したい(親プロセスから独立している子プロセスに関係していることを大まかに知っています(これは正しいですか?))

2)このタスクを実行するにはどうすればよいですか(スクリプトの実行の完了時にスクリプトがcd-edしたディレクトリに配置されます)?

4

4 に答える 4

4

これがシェルの作業ディレクトリです。スクリプトを実行すると、スクリプト用に新しいシェルが作成されます。親シェルではなく、コードの残りの部分で現在の作業ディレクトリを変更しています。

2)このタスクを実行するにはどうすればよいですか(スクリプトの実行の完了時にスクリプトがcd-edしたディレクトリに配置されます)?

これを達成するために&&、スクリプトを作成できます。したがって、スクリプトが正常に実行された場合は、あなただけが新しいディレクトリに移動します。

./tmp.sh && cd <to_your_directory>

unix.seの投稿も読む必要があります-なぜcdはプログラムではないのですか?より良い理解のために。

于 2013-02-14T17:43:18.297 に答える
2

簡単に言うと、スクリプトは別のプロセスで実行され、あるプロセスで現在のディレクトリを変更しても、他のプロセスには影響しません。同じことが、たとえば変数の設定にも当てはまります(これが引き起こす可能性のあるいくつかの魅力的なバグについては、ここを参照してください)。

source tmp.shそれを機能させるために、プロンプトで入力したかのようにスクリプトを実行するためにスクリプトをソースすることができます。より便利にするために、〜/.bashrcに関数を追加できます。

foo() { 
   cd somewhere
}

またはエイリアス

alias foo="cd somewhere"

どちらも、実行時にfoo(次のログインから)どこかにCDを挿入できるようになります。

于 2013-02-14T17:45:21.327 に答える
2

1)シェルスクリプトを実行すると、シェルの新しいインスタンスで実行されます。このシェルが終了すると、まだ手つかずの古いバージョンのシェルになります。つまり、シェルスクリプトは外部からのコードの一部にすぎません。

2)本当に良い解決策はありません。私はします

sh tmp.sh && cd /tmp
于 2013-02-14T17:43:46.440 に答える
0

1)現在の作業ディレクトリcwdは、プロセスの状態の一部です。シェルスクリプトが起動すると、それは新しいプロセスであるため、独自のcwdがあります。スクリプトのシェル内のコマンドは、そのプロセスのcwdにのみ影響します。

2)スクリプトが他の方法で出力を生成しない場合は、スクリプトに必要なディレクトリを出力させ、スクリプトを呼び出して出力場所を変更するシェル関数/エイリアスを設定できます。何かのようなもの

cd `script`
于 2013-02-14T17:46:22.117 に答える