Wie lege ich einen Alias ​​pro Verzeichnis fest?

18

Angenommen, Sie haben einen Alias go, möchten aber, dass dieser in verschiedenen Verzeichnissen unterschiedliche Aktionen ausführt?

In einem Verzeichnis sollte es ausgeführt werden cmd1, aber in einem anderen Verzeichnis sollte es ausgeführt werdencmd2

Übrigens, ich habe bereits einen Alias ​​für den Wechsel zu den oben genannten Verzeichnissen. Ist es also möglich, die Aliaszuweisung an den goAlias anzuhängen foo?

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

Arbeiten in Bash (?) Unter OSX.

B Sieben
quelle
1
Dafür sind Makefiles da.
Itsbruce

Antworten:

16

Es ist nicht ganz sicher, wonach Sie fragen, aber ein Alias ​​erweitert sich nur auf das, was sich im Alias ​​befindet. Wenn Sie zwei Aliase haben, können Sie die verschiedenen Befehle, auch Aliase, anhängen.

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

In jeder anderen Situation können Sie eine Funktion in Ihrer angeben .bashrc

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

Wenn Sie mehr Auswahlmöglichkeiten haben, können Sie besser eine Fallstruktur verwenden.

Bernhard
quelle
4

Ich habe das Gefühl, dass Sie sehr "verzeichnisorientiert" sind, und in diesem Fall passt dies möglicherweise besser zu Ihrer Mentalität.

(Um ehrlich zu sein, halte ich das für eine schlechte Idee. Sie möchten, dass Befehle global sind.)

In .bashrcsetzen alias go="./.cmd"(dann source ~/.bashrc).

Schreiben Sie dann in jedes dieser Verzeichnisse ein Skript mit dem Namen .cmd, dann machen Sie chmod +x .cmdeinfach goIhr Ding.

Emanuel Berg
quelle
2
Das ist eine Menge Arbeit ... hier ist der Anwendungsfall: Beim Ausführen von Tests möchte ich den Alias ​​rspec-all verwenden, um bestimmte Tests auszuführen. Aber welche Tests hängen vom Projekt ab. Und das wird durch das Verzeichnis bestimmt.
B Seven
2
Was ich sehe, haben Sie zwei Möglichkeiten, entweder eine Funktion zu verwenden (wie oben @Bernhard beschrieben) und je nach Verzeichnis zu verzweigen (wie er sagte), oder Sie könnten die Parameter in die Verzeichnisse setzen. touch .TESTNO; echo 2 > .TESTNOWenn Sie sich das überlegen , müssen es keine Skripte sein, Sie können einfach eine Datei ( ) in jedes Verzeichnis einfügen und dann in Ihrer Funktion nach dieser Datei suchen und anhand der Testnummer die .TESTNO-Datei verzweigen enthält. Obwohl dies überhaupt nicht schwierig ist, können Sie dafür wahrscheinlich keinen Alias ​​verwenden. Sie müssen eine Funktion verwenden.
Emanuel Berg
2

Ich arbeite an einem Projekt, das genau das erreicht. Probieren Sie es aus: localalias .

Hier ist eine Demo:

Bildbeschreibung hier eingeben

Witzigerweise habe ich das tatsächlich goals Beispiel in der Demo verwendet. Ich habe keine Verzeichniswechsel angezeigt (etwas, das ich an der Demo ändern sollte), aber die Funktionen mit dem laBefehl sind in der Tat lokal für das Verzeichnis, in dem sie definiert sind.

Bryan Bugyi
quelle
1
function go() {
  if [ ! -e "./.cmd1" ]
    then command go -a $1
    else command go -b $1
  fi
}

Ähnliches, aber vorausgesetzt, "go" ist ein Befehl, von dem Sie eine andere Funktionalität in einem bestimmten Verzeichnis wünschen.

Zweiter Planet
quelle
1

Wenn Sie Ihrem .bashrc die folgende Funktion hinzufügen

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

Jedes Mal, wenn Sie eine CD in ein Verzeichnis mit einer .aliases-Datei kopieren, wird diese gefunden.

Gehen Sie vorsichtig mit der Sicherheit um, wenn andere Benutzer Dateien auf Ihrem Computer erstellen können.

Mit diesem Trick werden Aliase nie entfernt, aber Sie können in der Funktion so viel Code schreiben, wie Sie möchten.

ondir nutzt diesen Trick und hat eine Menge Schnickschnack .

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

teknopaul
quelle
Obwohl ich das für schlau halte, scheint es gefährlich zu sein, da es sich darauf verlässt .bashrc. (Dies funktioniert cronzum Beispiel nicht für).
Ctbrown
Ich bin mir nicht sicher, ob bashrc gefährlich ist. Ich glaube, dass dies der Standard / richtige Ort für Aliase ist. Es liegt in der Natur der Umgebung, dass sie unterschiedlich sind. Geben Sie die Frage, eine andere Umgebung ist erforderlich. Nichts hindert Sie daran, die .bashrc-Datei eines Benutzers in cron zu finden, wenn cron eine ähnliche Umgebung haben soll. NB cron sollte sich aufgrund der Verwendung von isatty und chums immer anders verhalten als eine interaktive Shell.
Teknopaul
Es ist wahr, dass bashrc selbst nichts Gefährliches ist. Das Problem ist, dass Sie nicht sicherstellen können, dass der Prozess, der in das Verzeichnis wechselt, bashrc als Quelle verwendet. Es ist eine Sache, wenn es Ihre interaktive Sitzung ist. Es ist etwas ganz anderes, wenn dieses Verzeichnis von Benutzern und Prozessen gemeinsam genutzt wird, die möglicherweise die Bash-Shell verwenden oder nicht. .bash_aliases ist auf einigen Systemen der bevorzugte Speicherort für Bash-Aliase.
ctbrown