2013-01-23 12 views
5

Pracuję w środowisku Linux, w którym niektóre moduły muszą być ładowane w różnych obszarach roboczych. Są one oddzielone pojedynczymi katalogami systemu plików.Terminal systemu Linux: uruchom komendę podczas zmiany katalogu

Zastanawiam się, czy istnieje łatwy sposób uruchamiania różnych poleceń 1 linii podczas wprowadzania katalogów. Jestem elastyczny z typem używanej powłoki, ale obecnie używam C Shell.

Odpowiedz

6

Jeśli używasz bash, chciałbym wam polecić Aby utworzyć funkcję podobną do poniższej:

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

Tutaj Twoje własne polecenie może być wszystkim, co spowoduje wykonanie określonych poleceń zgodnie z do wpisanego katalogu.

Alias ​​zadeklarowany później upewnia się, że wpisanie "cd" spowoduje wywołanie funkcji i rzeczywistego polecenia cd.

edit: Przykład dla potrzeb

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 
} 

Objaśnienie:

Tworzymy zmienną zawierającą rodzica katalogu, który chcesz wprowadzić. Następnie pobieramy rodzica rodzica. Następnie tworzymy nazwę skryptu w katalogu grandparent.

Następnie sprawdza się wykonywalność tej nazwy pliku, jeśli tak, skrypt jest wykonywany, a na końcu wykonywane jest prawdziwe polecenie cd.

Należy pamiętać o zdefiniowaniu funkcji przed aliasem, ponieważ spowoduje to nieskończoną rekursję!

+1

Dla bezpieczeństwa, w funkcji użyj 'wbudowanego cd', aby upewnić się, że nie trafiłeś w alias. W rzeczywistości, jeśli używasz polecenia "builtin", nie potrzebujesz aliasu, możesz nazwać funkcję "cd". –

+1

@glennjackman nie wiedział o wbudowaniu, podejrzewałem, że coś takiego istnieje, fajnie! – SirDarius

+0

To działało świetnie. Zaimplementowałem coś w tym stylu przeniesionego na powłokę C, ale będzie także tworzyć wersję Bash. Dzięki! – devshans

2

dość niejasne pytanie, ale myślę, że komenda alias może pomóc:

alias cd='echo "hello $1"' 

ten wyświetli hello <arg given to cd> podczas próby cd gdzieś

+0

Sądzę, że to było dość ogólnikowe. Muszę uruchomić inne polecenie dla małego podzbioru całego systemu plików. Na przykład, jeśli chcę wejść do katalogu/home/user/a, chcę uruchomić /home/a.csh. Następnie, jeśli wejdę/home/scripts/b, uruchomię /home/b.csh – devshans

+0

To, co ci dałem, to starter. Nie zadziała na przykład, jeśli użyjesz gnoma lub innego menedżera plików. Nie wiem o niektórych wyzwalaczach, które można wykonać niestandardowo po zmianie katalogu. Może mógłbyś podłączyć się do czegoś związanego z polityką bezpieczeństwa –

3

Można wykonać funkcję uruchamiania tych specjalnych poleceń.

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

Wtedy nazywają tę funkcję wraz z cd z inną funkcją, na przykład.

cd2() { 
    cd $1 
    run_command 
} 

cd2 /path/to/somewhere