Ändern des aktuellen Arbeitsverzeichnisses mit einem Skript

8

Ich habe diese Frage und Antwort gelesen , aber sie passt nicht zu meinem Problem, obwohl sie ähnlich ist.

Ich schreibe ein Skript (cpj), mit dem eines meiner aktuellen Projekte gestartet wird. Ich habe ungefähr 5 von ihnen. Wenn ich tippe

$ cpj blah

Ich möchte, dass das aktuelle Arbeitsverzeichnis in das bla-Projektverzeichnis (das ich in $ PROJDIR habe) geändert wird, und ich möchte, dass emacsclient die Hauptdatei für dieses Projekt öffnet (die ich in $ MAINFILE halte).

Die von mir zitierte Frage besagt, dass Sie die Umgebung der Shell, in der das Skript ausgeführt wird, nicht direkt ändern können, aber Sie können ein Skript als Quelle verwenden, und dies wird auch der Fall sein.

Um dies zu testen, habe ich ein Shell-Skript (chcwd) geschrieben, das eine Zeile enthält:

cd $1

Wenn ich über die Befehlszeile Folgendes tue:

$ . chcwd $PROJDIR

Mein aktuelles Arbeitsverzeichnis ändert sich nach Wunsch. Wenn ich andererseits aus meinem cpj-Skript dieselbe Zeile habe:

. chcwd $PROJECT

Das aktuelle Arbeitsverzeichnis der Shell wird nicht geändert. Mir ist klar, dass ich 2 Skripte (cpj und dann chcwd) ausführe und so 2 Shells erstelle, aber ich sehe keine Möglichkeit, das zu tun, was ich will. Kann mir jemand zeigen, wie ich mein Ziel erreichen kann?

bev
quelle

Antworten:

11

Sie können Ihren Kuchen nicht haben und ihn auch nicht essen. Die beiden Dinge, die hier passieren, sind das Ausführen eines Skripts in einer neuen Shell und das Importieren von Skriptzeilen, die in der aktuellen Shell ausgeführt werden sollen. Mit dem Punktoperator (der ein Alias ​​für den sourceBefehl ist) führen Sie den Code tatsächlich in Ihrer aktuellen Shell aus . Wenn Ihr Code dies wünscht cd, werden Sie nach Abschluss des Vorgangs im neuen Verzeichnis belassen.

Wenn Sie andererseits ein Programm (oder ein Skript, es spielt keine Rolle) ausführen möchten, wird dieses Programm als Unterprozess gestartet. Bei Shell-Skripten wird eine neue Shell geöffnet und der Code darin ausgeführt. Jede durchgeführte cdAktion ändert das aktuelle Arbeitsverzeichnis für diese Shell, sodass alle Befehle folgen können. Wenn der Job beendet ist, wird die Shell beendet und Sie bleiben in Ihrer ursprünglichen (und unveränderten) Shell zurück.

Wenn Sie es häufig verwenden und möchten, dass seine Effekte in Ihrer aktuellen Shell zurückbleiben, können Sie Ihr "Skript" möglicherweise stattdessen als Shell-Funktion schreiben und in Ihrem ~ / .profile oder einer anderen Shell-RC-Datei speichern.

function cpj() {
    # code here
    cd /path/$1
    emacs file_name
}
Caleb
quelle
Caleb, danke für deine Eingabe. Ich mag dein Wortspiel. Ihr erster Absatz wiederholt bewundernswert, was ich in meiner Frage gesagt habe. Ihr zweiter Absatz wiederholt, was in der von mir zitierten Frage gesagt wurde. Ihr dritter Absatz ist genau das, wonach ich gesucht habe! Danke Alter.
Bev
2

Ich habe ein ähnliches Skript für meinen persönlichen Gebrauch geschrieben. Es gibt einen sehr einfachen Trick, um das Arbeitsverzeichnis innerhalb eines Skripts zu ändern. Schreiben Sie zuerst einfach Ihr Skript, 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

Nehmen wir nun an, das Skript heißt 'cdto'. Damit es funktioniert, müssen Sie es in der aktuellen Shell abrufen, was mit 'source' oder '' erreicht werden kann. Befehl (beide sind gleich). In Bsp.:

. cdto project1

Nun, um es bequemer zu machen:

  1. Kopieren Sie das 'cdto'-Skript in ein' bin'-Verzeichnis Ihres Kontos (z. B. / home / johnsmith / bin - erstellen Sie es, wenn es nicht vorhanden ist). Überprüfen Sie Ihre PATH-Variable, um sicherzustellen, dass das Verzeichnis 'bin' enthalten ist:

    echo $ PATH

Wenn nicht, bearbeiten Sie Ihre Profildatei und fügen Sie Folgendes hinzu:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
  1. Fügen Sie Ihrer .bashrc- oder .bash_aliases-Datei einen Alias ​​hinzu:

    alias cdto = '. cdto '

Und es ist geschafft. Nach dem nächsten Login oder wenn Sie ein neues Terminal öffnen, können Sie einfach in.ex verwenden:

cdto project1

Genießen :-)

Sebastian Piech

Sebastian Piech
quelle
0

Ein einfacher Trick, um dies zu tun:

pushd $PROJDIR && bash

Jetzt lautet das Arbeitsverzeichnis $ PROJECT.

artificerpi
quelle