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 s
als auch ember s
funktionieren und ich kann die App im Browser öffnen. Ein neuer Tab öffnet sich ebenfalls, allerdings in meinem Home-Verzeichnis. Laut derman-Seiten, das --active
soll "den zuletzt angegebenen Tab als aktiven in seinem Fenster setzen", cd
wird 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 myproject
es 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 myproject
durch
… gnome-terminal --tab --active && cd ~/code/myproject-ember
und dieser Code ausgeführt wird, gnome-terminal
wird die Tatsache, dass ausgeführt wird, nicht den nächsten Befehl ( cd ~/code/myproject-ember
) in eine Befehlszeile einfügenDort. cd
wird in der aktuellen Shell ausgeführt, nachdem dieser bestimmte gnome-terminal
Prozess erfolgreich beendet wurde. Der gesamte Codeausschnitt ähnelt:
… true && cd …
und es gibt keinen Grund, warum dies cd
woanders 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 danngnome-terminal
die Zeichenfolgecd ~/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
cd
ist sinnlos.cd …
wird nicht in einer Shell ausgeführt; dies erfordert eineseparatecd
ausfü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-terminal
würde „executecd
“ 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-terminal
eine interaktive Shell in einem Verzeichnis zu starten, istHier:
gnome-terminal --working-directory=/path/to/dir
Ähnlich wie zuvor gnome-terminal
wird es nicht erweitert , ~
wenn es nach kommt --working-directory=
. Verwenden Sie besser $HOME
und 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 $HOME
wird 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 rails
und ember
werden 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.)