So erstellen Sie einen komplexen Alias ​​(Ember starten, Rails starten und Verzeichnis ändern) in Ubuntu 20.10.4

So erstellen Sie einen komplexen Alias ​​(Ember starten, Rails starten und Verzeichnis ändern) in Ubuntu 20.10.4

Ich möchte einen Alias ​​verwenden, um meine Rails/Ember-App zu starten, eine neue Terminal-Registerkarte zu öffnen und per CD in das Ember-Verzeichnis zu wechseln. Ich verwende Ubuntu 20.10.4 und das Standard-Terminal. Das habe ich bisher:

alias myproject='cd ~/code/myproject-rails && rails s & cd ~/code/myproject-ember && ember s & gnome-terminal --tab --active && cd ~/code/myproject-ember'

Das funktioniert teilweise: Sowohl rails sals auch ember sfunktionieren und ich kann die App im Browser öffnen. Ein neuer Tab öffnet sich ebenfalls, allerdings in meinem Home-Verzeichnis. Laut derman-Seiten, das --activesoll "den zuletzt angegebenen Tab als aktiven in seinem Fenster setzen", cdwird aber (in diesem Tab) nicht ausgeführt.

Was ist hier falsch? Wenn ich gnome-terminal --tab -e "cd ~/code/myproject-ember"stattdessen benutze, gibt es eine FehlermeldungKeine solche Datei oder Verzeichnis.

Antwort1

Bitte lesen SieWann sollte in Bash ein Alias ​​verwendet werden, wann ein Skript und wann eine Funktion geschrieben werden?

Alias ​​ist ein rein textueller Ersatz. Ihr Alias ​​fügt so viel Code ein, dass es eleganter wäre, wenn myprojectes eine Funktion wäre. Dies ist ein Nebenthema. Sie können beim Alias ​​bleiben, wenn Sie möchten.

Das Hauptproblem ist, dass Sie erwarten cd ~/code/myproject-ember, in der neu geöffneten Registerkarte zu arbeiten. Wenn Ihr Alias ​​ersetzt wird myprojectdurch

… gnome-terminal --tab --active && cd ~/code/myproject-ember

und dieser Code ausgeführt wird, gnome-terminalwird die Tatsache, dass ausgeführt wird, nicht den nächsten Befehl ( cd ~/code/myproject-ember) in eine Befehlszeile einfügenDort. cdwird in der aktuellen Shell ausgeführt, nachdem dieser bestimmte gnome-terminalProzess erfolgreich beendet wurde. Der gesamte Codeausschnitt ähnelt:

… true && cd …

und es gibt keinen Grund, warum dies cdwoanders als in der Shell durchgeführt werden sollte, die den gesamten Befehl ausführt.

Ihr Versuch gnome-terminal --tab -e "cd ~/code/myproject-ember"schlägt fehl, weil:

  • ~wird nie erweitert. Ich verstehe, dass die Tilde in einfache Anführungszeichen gesetzt wird, wenn Sie den Alias ​​definieren. Nach der Alias-Erweiterung ist es dannin doppelten Anführungszeichen. Empfängt dann gnome-terminaldie Zeichenfolge cd ~/code/myproject-ember, teilt sie in Wörter auf (ohne die Tilde zu erweitern) und versucht, den resultierenden Befehl auszuführen, jedoch nicht in einer Shell (die sonst die Tilde schließlich erweitern könnte).
  • Diese Art der Ausführung cdist sinnlos. cd …wird nicht in einer Shell ausgeführt; dies erfordert eineseparate cdausführbare Datei, Sie können es in Ihrem Betriebssystem haben oder nicht. Selbst wenn Sie es hätten und selbst wenn die Tilde erweitert wäre, gnome-terminalwürde „execute cd“ seinen sinnlosen Job erledigen (sein eigenes Verzeichnis ändern) und beenden; und es gäbe in dieser Registerkarte nichts mehr zu tun.

Der richtige Weg, gnome-terminaleine interaktive Shell in einem Verzeichnis zu starten, istHier:

gnome-terminal --working-directory=/path/to/dir

Ähnlich wie zuvor gnome-terminalwird es nicht erweitert , ~wenn es nach kommt --working-directory=. Verwenden Sie besser $HOMEund und stellen Sie sicher, dass es von Ihrer aktuellen Shell erweitert wird. Wenn Sie einen Alias ​​verwenden möchten, kann dies sein:

alias myproject='cd ~/code/myproject-rails && rails s & cd ~/code/myproject-ember && ember s & gnome-terminal --tab --active "--working-directory=$HOME/code/myproject-ember"'

In diesem Fall $HOMEwird nach jeder Alias-Erweiterung erweitert.

Wie gesagt, meiner Meinung nach wäre eine Funktion eleganter:

unalias myproject
myproject () {
   cd ~/code/myproject-rails && rails s &
   cd ~/code/myproject-ember && ember s &
   gnome-terminal --tab --active "--working-directory=$HOME/code/myproject-ember"
}

Hinweis railsund emberwerden Arbeitsplätze in deraltSchale. Ich weiß nicht, was sie sind, aberVielleichtSie möchten sie als Jobs in der neuen Shell haben. Das ist möglich, aber ich werde hier nicht näher darauf eingehen. (Wenn Sie es brauchen und keine Lösung finden, stellen Sie eine separate Frage.)

verwandte Informationen