web-dev-qa-db-ja.com

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

スクリプトを実行して、現在の作業ディレクトリを変更するだけです。

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

しかし、実行した後、現在のパスワードは変更されません。どうやってやるの?

56
Sony Santos

これは予想される動作であり、すでに何度か議論されています。

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

ディレクトリを永続的に変更するには、次のようにsourceスクリプトを実行する必要があります

. ./script
76
enzotib

このような小さなタスクでは、スクリプトを作成する代わりに、次のようなエイリアスを作成します。

$ alias cdproj='cd /dir/web/www/proj'

すべてのインタラクティブシェルに設定する場合は、.bashrcファイルに追加する必要があります。

これを$ cdprojとして実行できます。

27
Sachin Divekar

使用する exec bash 最後に

Bashスクリプトは、現在の環境またはその子の環境で動作しますが、親の環境では動作しません。

ただし、この質問は、別のディレクトリからのbashスクリプトを実行後、特定のディレクトリのbashプロンプトに残したいので、よく聞かれます。

この場合は、スクリプトの最後で子bashインスタンスを実行するだけです。

#!/usr/bin/env bash
cd desired/directory
exec bash

これにより、新しいサブシェルが作成されます。 exitと入力して、スクリプトが最初に開始された最初のシェルに戻ります。

14

あなたが望む正確な行動をする答えがありますが、そのような目的のためのより標準的な方法はシンボリックリンクを作成することです:

ln -s ~/web/www/project proj   #use full path to dir!

次に、cdという名前を使用して、ディレクトリにprojできます。

cd proj

cdなしで短い名前を使用してファイルにアクセスできるため、この方法はより柔軟です。

ls proj/   #note the endslash!
vim proj/file.x
8
corvinus

何をしようとしているのかに応じて、スクリプトの代わりに関数を作成することもできます。

例:

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

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

次に、それをbashrcまたはzshrcファイルに含めます。

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

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

$ my-cd
5
Aidin

ファイルシステムで遠く離れたディレクトリ間で変更した場合。 autojump をお勧めします。

4
stnly

PWDに書き込み、スクリプト内でエクスポートするだけで、変更が持続します。

export PWD=/your/desired/directory
1
Samha'

私にとって最も便利で柔軟なアプローチは、エイリアスとスクリプトの混合でした。

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

ここでは、ディレクトリに変更して適切な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と組み合わせて最新の変更をすぐに取得したりすることができます...すべてのボイラープレートはあなたのものです特定のプロジェクトで作業を続けるときに行います。

0
Jan

"exec"を使用しないのはなぜですか。

#!/bin/bash

cd someplace
exec bash

~/someplace
0
paul