私は読んだこれ質問と回答は似ていますが、私の問題に正確には合いません。
私は現在プロジェクトの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
}