現在のディレクトリを変更するスクリプト(cd、pwd)

現在の作業ディレクトリを変更するスクリプトを実行したい:

#!/bin/bash cd web/www/project 

しかし、実行した後、現在のpwdは変更されません。どうすればよいですか?

回答

これは予想される動作です。スクリプトはサブシェルで実行され、親シェルの作業ディレクトリを変更することはできません。終了するとその効果は失われます。

現在のシェルのディレクトリを永続的に変更するには、sourceコマンドを使用する必要があります。これも単に.。サブシェルではなく、現在のシェル環境でスクリプトを実行します。

次のコマンドは同じです。

. script 

または

source script 

コメント

  • @Sony:使用する必要があることに注意してくださいreturnは、exitではなく、この方法でソースされたスクリプトからエスケープします。これらはシェル関数のようなもので、exitはスクリプトをソースしたシェルを終了します。
  • @CharlesStewart実際、私は'ソーススクリプトに精通していません。ありがとうございます。
  • source ./scriptは同じですか?
  • @amyassin:はい、そうです
  • 1. .sourceはbashで同じです。2。'同じディレクトリに'ある場合は、ファイル名の前に./を使用する必要はありません。これだけを実行しても問題ありません:. 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 

回答

内容によって異なります「これから行う別の解決策は、スクリプトの代わりに関数を作成することです。

例:

ファイルに関数を作成します。たとえば、/home/aidin/my-cd-script

function my-cd() { cd /to/my/path } 

次に、それをbashrcまたはファイル:

# Somewhere in rc file source /home/aidin/my-cd-script 

これで、コマンドのように使用できます:

$ my-cd 

回答

ファイルシステム内の遠く離れたディレクトリ間を変更した場合。 自動ジャンプをお勧めします。

回答

私にとって最も便利で柔軟なアプローチは、エイリアスとスクリプトを組み合わせることでした。

任意のロジックでスクリプトを作成する

ここでは、ディレクトリに変更して適切なPython環境をアクティブ化するスクリプトを作成します。スクリプトの場所は、/path/to/workon_myproj.shの例です。

#!/usr/bin/env bash cd $HOME/workspace/myproj source .venv/bin/activate 

スクリプトのソースとなるエイリアスを作成します

alias workon_myproj="source /path/to/workon_myproj.sh" 

エイリアス定義を適切なシェル開始ファイルに追加します。例: .profile.bashrcまたは.zshrc

結果

これで、シェルでworkon_myprojを実行するだけで、スクリプトのコンテンツを目的のディレクトリに配置できます。

拡張性

特定の作業ディレクトリ内の複数のプロジェクトで機能するようにスクリプトを引数を取るようにイベントを改善したり、git pullと組み合わせて最新の変更をすぐに取得したりできます。 on …特定のプロジェクトで作業を続けるときに行うすべてのボイラープレートの処理。

回答

「 exec」は、私が望むことを正確に実行するために継ぎ目があります。

#!/bin/bash cd someplace exec bash ~/someplace 

コメント

  • 次のことに注意してください。 あなたが望むもののようです。 (巨大な木製の馬!私が欲しかったものです!)これを実行するたびに、新しい永続的なbashプロセスが作成されます。セッションで10〜20回実行すると、11〜21のbashプロセスが積み重ねられます。これはパフォーマンスに影響を与える可能性があり、exit(またはCtrl + D)と入力してセッションを正常に終了しようとすると、11〜21回実行する必要があります。
  • それがどこで問題になるかは間違いなくわかりました。私にとっては、' 1回使用し、必要な作業を行ってから終了します。'が唯一の欠点である場合それと一緒に暮らすことができます。一方、より良い解決策がある場合は、'喜んで検討します。
  • シェル関数を使用したこの質問に対するAidinの回答、およびエイリアスを使用した Sachin Divekarの回答は、スクリプトを使用するよりも(IMO)優れたソリューションです。 。 P.S.スクリプトを使用するもう1つの欠点は、シェルオプション(dotglobglobstarなど)を設定すると、それらが失われることです。新しいシェルを開始しているからです。 …(続き)
  • (続き)…P.P.S。基本的に、 Serge Stroobandtの回答を繰り返し、 Stack Exchange 回答は、他の回答について話し合うだけでなく、新しいアイデアや情報を提供することを期待しています。

回答

これは、セルジュによる回答デビッドによる無関係な回答を組み合わせたものです。ディレクトリを変更し、bashシェルを強制する代わりに、ユーザーのデフォルトシェルを起動します。ただし、 getent/etc/passwdの両方でデフォルトのシェルを検出します。

 #!/usr/bin/env bash cd desired/directory USER_SHELL=$(getent passwd <USER> | cut -d : -f 7) $USER_SHELL  

もちろん、これにはネストされたシェルを作成するのと同じ欠点があります。

回答

これは、関数または& &を使用して実行できます。次の例では、Zabbixをインストールして、

例:

#!/bin/bash # Create Function: installZabbix(){ cd /usr/src/zabbix-4.2.4; ./configure --enable-agent; make install; cd /usr/src/; >file; echo "Hi, this is a file." >>file; } # Call the function: installZabbix 

または:

#!/bin/bash cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です