スクリプトで現在の作業ディレクトリを変更する


8

私はこの質問と回答を読みましたが、それが私の問題に完全に適合しているわけではありません。

現在のプロジェクトの1つを起動するスクリプト(cpj)を書いています。私はそれらの約5を持っています。入力すると

$ cpj blah

現在の作業ディレクトリをblahプロジェクトディレクトリ($ PROJDIRに保持)に変更し、emacsclientがそのプロジェクトのメインファイル($ MAINFILEに保持)を開くようにします。

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

これをテストするために、1行のシェルスクリプト(chcwd)を作成しました。

cd $1

コマンドラインから私が行う場合:

$ . chcwd $PROJDIR

私の現在の作業ディレクトリは、必要に応じて変更されます。一方、私のcpjスクリプトから、同じ行がある場合:

. chcwd $PROJECT

シェルの現在の作業ディレクトリは変更されません。私は2つのスクリプト(cpjとchcwd)を実行しているため、2つのシェルを作成していることを理解していますが、希望どおりに実行する方法がありません。誰かが私の目標を達成する方法を教えてもらえますか?

回答:


11

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

一方、プログラム(またはスクリプト、問題ではない)を実行する場合、そのプログラムはサブプロセスとして起動されます。シェルスクリプトの場合、新しいシェルが開かれ、その中でコードが実行されます。どれcd取られるアクションは、任意のコマンドが追随するために効果的な、そのシェルの現在の作業ディレクトリを変更します。ジョブが完了するとシェルが終了し、元の(変更されていない)シェルに戻ります。

それが頻繁に使用するもので、その効果を現在のシェルに残したい場合は、代わりに「スクリプト」をシェル関数として記述し、それを〜/ .profileまたは他のシェルrcファイルに保存できます。

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

カレブ、あなたの入力のためのTHX。私はあなたのしゃれが好きです。あなたの最初の段落は、私の質問で私が見事に言ったことを言い換えています。2番目の段落は、私が非常によく引用した質問で述べられたことを要約しています。3番目の段落は、まさに私が探していたものです。ありがとう、相棒。
11年

2

私の個人的な使用のために書かれた同様のスクリプトがあります。スクリプト内で作業ディレクトリを変更する非常に簡単なトリックがあります。まず、スクリプトをin.ex.に記述します。

#!/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」と呼ばれているとしましょう。それを機能させるためには、現在のシェルでそれを調達する必要があります。コマンド(どちらも同じ)。例:

. 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

楽しい :-)

セバスチャン・ピーチ


0

これを行う簡単なトリック:

pushd $PROJDIR && bash

現在、作業ディレクトリは$ PROJECTです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.