スクリプトを使用して現在の作業ディレクトリを変更する

スクリプトを使用して現在の作業ディレクトリを変更する

私は読んだこれ質問と回答は似ていますが、私の問題に正確には合いません。

私は現在プロジェクトの1つを起動するスクリプト(cpjと呼ばれる)を作成しています。私はそのうちの5つを持っています。私が入力している間

$ cpj blah

現在の作業ディレクトリをblahプロジェクトディレクトリ($ PROJDIRに保存)に変更し、emacsclientにプロジェクトのデフォルトファイル($ MAINFILEに保存)を開くようにしたいと思います。

私が引用した質問は、スクリプトが実行されているシェルの環境を直接変更することはできませんが、スクリプトを取得してそれを行うと言います。

これをテストするために、次の行を使用してシェルスクリプト(chcwdと呼ばれる)を作成しました。

cd $1

コマンドラインで次のことを行うと:

$ . chcwd $PROJDIR

私の現在の作業ディレクトリは私の希望に応じて変更されます。一方、cpjスクリプトから同じ行を取得した場合:

. chcwd $PROJECT

シェルの現在の作業ディレクトリは変更されません。 2つのスクリプト(cpj、次にchcwd)を実行して2つのシェルを作成していますが、必要なものを達成する方法がないことがわかります。誰でも私の目標を達成する方法を教えてもらえますか?

答え1

ケーキを持っていても食べることはできません。ここで起こる2つのことは、新しいシェルでスクリプトを実行し、現在のシェルで実行するスクリプト行を取得することです。点演算子(コマンドのエイリアスsource)を使用すると、実際にコードが実行されます。現在のシェルから。コードを選択すると、cd完了時に新しいディレクトリに残ります。

一方、プログラム(またはスクリプトは重要ではありません)を実行しようとすると、プログラムは子プロセスで始まります。シェルスクリプトの場合、新しいシェルが開き、その中でコードが実行されます。実行されたすべてのアクションは、cd実行中のすべてのコマンドに有効なシェルの現在の作業ディレクトリを変更します。操作が完了すると、シェルは終了し、変更されていない元のシェルに戻ります。

頻繁に使用して現在のシェルでその効果を維持するには、「スクリプト」をシェル関数として作成し、〜/ .profileまたは他のシェルrcファイルに保存できます。

function cpj() {
    # code here
    cd /path/$1
    emacs file_name
}

答え2

個人的な目的のために同様のスクリプトがあります。スクリプト内で作業ディレクトリを変更する非常に簡単な方法があります。まずスクリプトを書いてください。たとえば、次のようになります。

#!/bin/bash

case $1 in
     project1) cd /home/me/work/customer1/project1
     ;;
     project2) cd /home/me/work/customer2/project1
     ;;
     project3) cd /home/me/work/customer3/project2
     ;;
     project4) cd /home/me/work/customer4/project5
     ;;
     *) echo "Usage: cdto cd_profile_name"
     ;;
esac

ここで、スクリプト名が「cdto」であると仮定します。これが機能するには、現在のシェルからこれを取得する必要があります。これは、「source」または「.」を使用して取得できます。コマンド(両方とも同じ)。たとえば、

. cdto project1

今より便利に:

  1. "cdto"スクリプトをアカウントの "bin"ディレクトリにコピーします(例:/home/johnsmith/bin - 存在しない場合は作成)。 PATH変数を調べて、「bin」ディレクトリが含まれていることを確認してください。

    $PATH エコ

そうでない場合は、.profile ファイルを編集し、以下を追加します。

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
  1. .bashrc または .bash_aliases ファイルにエイリアスを追加します。

    エイリアス cdto='.cdto'

すべてが完了しました。次回ログインした後、または新しい端末を開くときにin.exを使用できます。

cdto project1

楽しむ:-)

セバスチャン・ピエッチ

答え3

簡単な方法でこれを行うことができます。

pushd $PROJDIR && bash

これで、作業ディレクトリは$ PROJECTです。

関連情報