9

私のbashスクリプト:

#!/bin/bash
cd /tmp

スクリプトを実行する前に:

pwd: /

私のスクリプトを実行した後:

pwd: /

スクリプトを実行してソースを取得した後:

pwd: /tmp

ソースを取得せずにスクリプトからのパスに留まるにはどうすればよいですか?

4

6 に答える 6

14

できません。現在のディレクトリへの変更は、現在のプロセスにのみ影響します。

于 2010-12-16T14:14:28.627 に答える
6

これについて少し詳しく説明しましょう。

スクリプトを実行すると、bash は新しいプロセスを作成し、現在のディレクトリへの変更はそのプロセスにのみ影響します。

スクリプトをソースすると、スクリプトは実行中のシェルによって直接実行され、追加のプロセスは作成されないため、現在のディレクトリへの変更はメインのシェル プロセスに表示されます。

したがって、イグナシオが指摘したように、これはできません

于 2010-12-16T14:20:39.343 に答える
3

これはばかげた考えです。PROMPT_COMMANDを使用します。例えば:

$ export PROMPT_COMMAND ='test -f $ CDFILE && cd $(cat $ CDFILE)&& rm $ CDFILE'
$ export CDFILE = / tmp/cd。$$

次に、スクリプトの最後の行を「pwd>$CDFILE」にします。

于 2010-12-16T17:58:17.823 に答える
3

イグナシオは正しいです。ただし、凶悪なハックとして(まったくアドバイスがなく、これにより少なくとも10の反対票が得られるはずです)、完了したら新しいシェルを実行できます

#!/ビン/バッシュ
...
CD /
実行バッシュ
于 2010-12-16T14:17:15.643 に答える
2

この動作が本当に必要な場合は、スクリプトにディレクトリを返させてから、何らかの方法で使用することができます。何かのようなもの:

#!/bin/bash
cd /tmp
echo $(pwd)

そして、あなたはすることができます

cd $(./script.sh)

醜いですが、この単純なケースではうまくいきます。

于 2010-12-16T17:46:25.783 に答える
1

これをサポートするために、現在のシェルで実行する関数を定義できます。例えば

md() { mkdir -p "$1" && cd "$1"; }

~/.bashrc に上記があります

于 2010-12-16T15:56:23.547 に答える