2013-01-23 15 views
5

Ich arbeite in einer Linux-Umgebung, in der bestimmte Module für verschiedene Arbeitsbereiche geladen werden müssen. Diese sind durch einzelne Dateisystemverzeichnisse getrennt.Linux-Terminal: Befehl beim Ändern des Verzeichnisses ausführen

Ich frage mich, ob es eine einfache Möglichkeit gibt, verschiedene 1-Zeilen-Befehle beim Eingeben von Verzeichnissen auszuführen. Ich bin flexibel mit der Art der verwendeten Shell, aber verwende derzeit C Shell.

Antwort

6

Wenn Sie bash verwenden, würde ich Ihnen empfehlen Um eine Funktion wie folgt zu erstellen:

function custom_cd() { custom_command $1; cd $1; } 
alias cd='custom_cd' 

Hier kann Ihr benutzerdefinierter Befehl alles sein, was bestimmte Befehle ausführen wird zu dem Verzeichnis, das Sie eingeben.

Der später deklarierte Alias ​​stellt sicher, dass die Eingabe von "cd" die Funktion und den Befehl "real cd" aufruft.

bearbeiten: Ein Beispiel für die Notwendigkeit

function custom_cd() { 
    if [ -z "$1" ]; 
    then 
     target=~ 
    else 
     target=$1 
    fi 
    target=${target%/} 
    parent=$(dirname `readlink -f $target`) 
    grand_parent=`dirname $parent` 
    script=$grand_parent/`basename $target`.sh 
    if [ -x $script ]; 
    then 
     `$script` 
    fi 
    cd $1 
} 

Erläuterung:

Wir schaffen eine Variable, die die Eltern des Verzeichnisses enthält, die Sie eingeben möchten. Dann rufen wir die Eltern der Eltern ab. Dann erstellen wir den Skriptnamen im Großelternverzeichnis.

Dann wird die Ausführbarkeit dieses Dateinamens überprüft, wenn dies der Fall ist, wird das Skript ausgeführt, und schließlich wird der echte CD-Befehl ausgeführt.

Seien Sie vorsichtig, die Funktion vor dem Alias ​​zu definieren, sonst wird es eine unendliche Rekursion verursachen!

+1

Für die Sicherheit verwenden Sie in der Funktion 'eingebaute CD', um sicherzustellen, dass Sie nicht den Alias ​​treffen. Wenn Sie den Befehl "builtin" verwenden, benötigen Sie den Alias ​​nicht. Sie können die Funktion "cd" nennen. –

+1

@Glennjackman wusste nicht über BuiltIn, ich vermutete, dass so etwas existiert, schön! – SirDarius

+0

Das hat super funktioniert. Ich habe etwas in diesem Stil implementiert, das auf C-Shell portiert wurde, aber ich werde auch eine Bash-Version machen. Vielen Dank! – devshans

2

eine ziemlich vage Frage, aber ich denke, die alias Befehl könnte Ihnen helfen:

alias cd='echo "hello $1"' 

diese hello <arg given to cd> angezeigt wird, wenn Sie cd versuchen irgendwo

+0

Ich denke, es war ziemlich vage. Ich muss einen anderen Befehl für eine kleine Teilmenge des gesamten Dateisystems ausführen. Zum Beispiel, wenn ich Verzeichnis/home/user/a eingeben möchte, dann möchte ich /home/a.csh ausführen. Dann, wenn ich/home/scripts/b eingeben, würde ich laufen /home/b.csh – devshans

+0

Was ich dir gab ist ein Starter. Es funktioniert nicht, wenn Sie z. B. gnome oder einen anderen Dateimanager verwenden. Mir sind einige Trigger nicht bekannt, die beim Ändern eines Verzeichnisses benutzerdefiniert ausgeführt werden können. Vielleicht könnten Sie etwas in Zusammenhang mit Sicherheitsrichtlinien einhängen –

3

Sie könnten eine Funktion ausführen, um diese speziellen Befehle auszuführen.

run_command() { 
    case `pwd` in 
    "/path/to/dir1") 
     ... 
     ;; 
    "/path/to/dir2") 
     ... 
     ;; 
    ... 
    esac 
} 

Dann rufen Sie diese Funktion zusammen mit cd mit einer anderen Funktion zum Beispiel.

cd2() { 
    cd $1 
    run_command 
} 

cd2 /path/to/somewhere 
Verwandte Themen