Jak ustawić alias dla poszczególnych katalogów?

18

Załóżmy, że masz pseudonim go, ale chcesz, aby robił różne rzeczy w różnych katalogach?

W jednym katalogu powinien działać cmd1, ale w innym katalogu powinien działaćcmd2

Nawiasem mówiąc, mam już aliasy do przełączania się do powyższych katalogów, więc czy można dołączyć goprzypisanie aliasu do fooaliasu?

alias "foo=cd /path/to/foo"

Praca w bash (?) Na OSX.

B Seven
źródło
1
Po to są pliki makefile.
itsbruce

Odpowiedzi:

16

Nie jest całkowicie pewne, o co pytasz, ale alias po prostu rozwija się do tego, co jest w aliasie. Jeśli masz dwa aliasy, możesz dołączyć różne polecenia, nawet aliasy.

alias "foo=cd /path/to/foo; go"
alias "foo2=cd /path/to/foo2; go"

W każdej innej sytuacji możesz określić funkcję w swoim .bashrc

function go ()
{
    if [ "$PWD" == "/path/to/foo" ]; then
       cmd1
    elif [ "$PWD" == "/path/to/go" ]; then
       cmd2
    fi;
}

Jeśli masz więcej możliwości, lepiej użyj struktury sprawy.

Bernhard
źródło
4

Mam wrażenie, że jesteś bardzo „zorientowany na katalog” i w takim przypadku może to lepiej pasować do twojej mentalności.

(Ale szczerze mówiąc, myślę, że to zły pomysł, chciałbyś, aby polecenia były globalne).

W .bashrcumieścić alias go="./.cmd"(następnie source ~/.bashrc).

Następnie w każdym takim katalogu umieść skrypt o nazwie .cmd, a chmod +x .cmdnastępnie po prostu gozrób swoje.

Emanuel Berg
źródło
2
To dużo pracy ... oto przypadek użycia: Podczas uruchamiania testów chcę mieć alias rspec-all, aby uruchomić pewne testy. Ale które testy zależą od projektu. To zależy od katalogu.
B, 7
2
Widzę, że masz dwie opcje: albo użyj jednej funkcji (jak opisany powyżej @Bernhard), i gałąź w zależności od katalogu (tak jak powiedział), albo możesz umieścić parametry w katalogach. Pomyśl o tym, nie muszą to być skrypty, możesz po prostu umieścić plik ( touch .TESTNO; echo 2 > .TESTNO) w każdym katalogu, a następnie, w swojej funkcji, poszukać tego pliku i rozgałęzić się zgodnie z numerem testu pliku .TESTNO zawiera. Chociaż wcale nie jest to trudne, prawdopodobnie nie możesz użyć do tego aliasu; musisz użyć funkcji.
Emanuel Berg
2

Pracuję nad projektem, który właśnie to osiąga. Sprawdź to: localalias .

Oto demo:

wprowadź opis zdjęcia tutaj

Zabawne, faktycznie użyłem gotego przykładu w demie. Nie pokazywałem przełączania katalogów (coś, co powinienem zmienić w wersji demo), ale funkcje z lapoleceniem są rzeczywiście lokalne dla katalogu, w którym są zdefiniowane.

Bryan Bugyi
źródło
1
function go() {
  if [ ! -e "./.cmd1" ]
    then command go -a $1
    else command go -b $1
  fi
}

Podobnie, ale zakładając, że „go” jest poleceniem, które ma mieć inną funkcjonalność niż w określonym katalogu.

secondplanet
źródło
1

Jeśli dodasz następującą funkcję do .bashrc

function cd () { 
  builtin cd "$@" && [[ -f .aliases ]] && . .aliases
  return 0
}

Za każdym razem, gdy przejdziesz do katalogu z plikiem .aliases, zostanie on pobrany.

Zachowaj ostrożność, jeśli inni mogą tworzyć pliki na twoim komputerze.

Dzięki tej sztuczce aliasy nigdy nie są usuwane, ale możesz napisać tyle funkcji, ile chcesz w funkcji.

ondir używa tej sztuczki i ma mnóstwo dzwonków i gwizdków.

http://swapoff.org/ondir.html#download

teknopaul
źródło
Chociaż myślę, że to sprytne, wydaje się niebezpieczne, ponieważ polega na tym .bashrc. (Na przykład to nie zadziała cron).
ctbrown
Nie jestem pewien, czy w bashrc jest coś niebezpiecznego. Uważam, że jest to standardowe / prawidłowe miejsce dla aliasów. Różnią się one charakterem środowisk. Podaj pytanie, wymagane jest inne środowisko. Nic nie powstrzyma Cię przed pozyskiwaniem użytkowników .bashrc w cron, jeśli chcesz, aby cron miał podobne środowisko. NB cron zawsze powinien zachowywać się inaczej niż interaktywna powłoka ze względu na użycie isatty i kumpli.
teknopaul
To prawda, że ​​samo bashrc nie jest niebezpieczne. Problem polega na tym, że nie masz możliwości zapewnienia, że ​​proces, który zmienia się w katalog, będzie źródłem bashrc. To jedno, jeśli jest to twoja interaktywna sesja. To zupełnie inna sprawa, jeśli katalog ten jest współużytkowany przez użytkowników i procesy, które mogą, ale nie muszą korzystać z powłoki bash. .bash_aliases jest preferowaną lokalizacją aliasów bash w niektórych systemach.
ctbrown,