現在の作業ディレクトリを変更するスクリプトを実行したい:
#!/bin/bash cd web/www/project
しかし、実行した後、現在のpwdは変更されません。どうすればよいですか?
回答
これは予想される動作です。スクリプトはサブシェルで実行され、親シェルの作業ディレクトリを変更することはできません。終了するとその効果は失われます。
現在のシェルのディレクトリを永続的に変更するには、source
コマンドを使用する必要があります。これも単に.
。サブシェルではなく、現在のシェル環境でスクリプトを実行します。
次のコマンドは同じです。
. script
または
source script
コメント
回答
このような小さなタスクの場合、スクリプトを作成する代わりに、次のようなエイリアスを作成します。
$ alias cdproj="cd /dir/web/www/proj"
これをファイル(すべてのインタラクティブシェルに設定する場合)。
これで、これを$ cdproj
として実行できます。
コメント
- スクリプトに実行するコマンドをエコーさせてから、
eval `./script`
またはeval $(./script)
でこれらのコマンドを実行します。これは、呼び出し元のシェル'の環境を更新する必要があるコマンドの一般的なアプローチです。 - 実行する場合は、出力内容に十分注意してください。
eval
アプローチ。
回答
最後
bashスクリプトは、現在の環境またはその子の環境で動作しますが、親環境。
ただし、をbashに残したいので、この質問はよく聞かれます。別のディレクトリからbashスクリプトを実行した後、特定のディレクトリでプロンプトを表示します。
この場合は、最後に子bashインスタンスを実行するだけです。スクリプトの内容:
#!/usr/bin/env bash cd desired/directory exec bash
これにより、新しいサブシェルが作成されます。 Ctrl + D またはexit
と入力して、スクリプトが最初に開始された最初のシェルに戻ります。
更新
少なくとも新しいバージョンのbash
では、最後の行のexec
は不要になりました。さらに、$SHELL
環境変数を使用して、スクリプトを任意の優先シェルで動作させることができます。
#!/usr/bin/env bash cd desired/directory $SHELL
コメント
- 受け入れられた回答のように、スクリプトを入手する方がよい:
exec
の使用は、通常、悪党の最後の手段と見なされます。:) - このトリックは' t debian9ストレッチで動作します。
- これは間違った方法です!
- これに関する問題の詳細は誰も知らないので(私はあなたを見ています、@ Dennis): (1)これを実行するたびに、新しい永続的なbashプロセスが作成されます。セッションで10〜20回実行すると、11〜21のbashプロセスが積み重なっていきます。これはパフォーマンスに影響を与える可能性があり、
exit
(またはCtrl + D)と入力してセッションを正常に終了しようとすると、11〜21回実行する必要があります。 (2)実行可能スクリプトを使用するもう1つの欠点は、シェルオプション(dotglob
またはglobstar
など)を設定した場合です。インタラクティブシェルセッションでは、新しいシェルを開始しているため、それらは失われます。 - 非常に優れたソリューションです。 'エイリアスをbash_profileに書き直したので、別のファイルに保存されたスクリプトになりました。スクリプトを使用して、新しく作成された一時フォルダーに移動します。そして今、一時的なbashセッションを持つことはさらに簡単です。 SRPの実行中!ありがとう!
回答
必要なアクションを実行する回答がありますが、そのためのより標準的な方法です。目的はシンボリックリンクを作成することです:
ln -s ~/web/www/project proj #use full path to dir!
次に、cd
という名前を使用してディレクトリに移動できます。 = “6e24851ea5″>
:
cd proj
:
ls proj/ #note the endslash! vim proj/file.x
return
は、exit
ではなく、この方法でソースされたスクリプトからエスケープします。これらはシェル関数のようなもので、exit
はスクリプトをソースしたシェルを終了します。source ./script
は同じですか?.
とsource
はbashで同じです。2。'同じディレクトリに'ある場合は、ファイル名の前に./
を使用する必要はありません。これだけを実行しても問題ありません:. script