私のbashスクリプト:
#!/bin/bash
cd /tmp
スクリプトを実行する前に:
pwd: /
私のスクリプトを実行した後:
pwd: /
スクリプトを実行してソースを取得した後:
pwd: /tmp
ソースを取得せずにスクリプトからのパスに留まるにはどうすればよいですか?
できません。現在のディレクトリへの変更は、現在のプロセスにのみ影響します。
これについて少し詳しく説明しましょう。
スクリプトを実行すると、bash は新しいプロセスを作成し、現在のディレクトリへの変更はそのプロセスにのみ影響します。
スクリプトをソースすると、スクリプトは実行中のシェルによって直接実行され、追加のプロセスは作成されないため、現在のディレクトリへの変更はメインのシェル プロセスに表示されます。
したがって、イグナシオが指摘したように、これはできません
これはばかげた考えです。PROMPT_COMMANDを使用します。例えば:
$ export PROMPT_COMMAND ='test -f $ CDFILE && cd $(cat $ CDFILE)&& rm $ CDFILE' $ export CDFILE = / tmp/cd。$$
次に、スクリプトの最後の行を「pwd>$CDFILE」にします。
イグナシオは正しいです。ただし、凶悪なハックとして(まったくアドバイスがなく、これにより少なくとも10の反対票が得られるはずです)、完了したら新しいシェルを実行できます
#!/ビン/バッシュ ... CD / 実行バッシュ
この動作が本当に必要な場合は、スクリプトにディレクトリを返させてから、何らかの方法で使用することができます。何かのようなもの:
#!/bin/bash
cd /tmp
echo $(pwd)
そして、あなたはすることができます
cd $(./script.sh)
醜いですが、この単純なケースではうまくいきます。
これをサポートするために、現在のシェルで実行する関数を定義できます。例えば
md() { mkdir -p "$1" && cd "$1"; }
~/.bashrc に上記があります