我想使用別名來啟動我的 Rails/Ember 應用程序,打開一個新的終端選項卡並 cd 進入 Ember 目錄。我使用 Ubuntu 20.10.4 和預設終端。這是我到目前為止所擁有的:
alias myproject='cd ~/code/myproject-rails && rails s & cd ~/code/myproject-ember && ember s & gnome-terminal --tab --active && cd ~/code/myproject-ember'
這部分有效: 和 都rails s
可以ember s
工作,我可以在瀏覽器中開啟該應用程式。也會開啟一個新選項卡,但位於我的主目錄中。根據手冊頁,--active
應該“將最後一個指定的選項卡設定為其視窗中的活動選項卡”,但cd
不會執行(在此選項卡中)。
這裡有什麼問題嗎?當我使用gnome-terminal --tab -e "cd ~/code/myproject-ember"
它時,出現錯誤訊息沒有這樣的檔案或目錄。
答案1
請閱讀在 Bash 中,何時使用別名、何時使用腳本以及何時編寫函數?
Alias 是純粹的文字替換。您的別名註入瞭如此多的程式碼,如果myproject
是一個函數會更優雅。這是一個側面的“問題”。如果需要,您可以保留別名。
主要問題是您希望cd ~/code/myproject-ember
在新開啟的選項卡中工作。當您的別名替換myproject
為
… gnome-terminal --tab --active && cd ~/code/myproject-ember
並且執行此程式碼時,執行的事實gnome-terminal
不會將下一個命令(cd ~/code/myproject-ember
)注入到命令列中那裡。cd
該特定進程成功退出後將在目前 shell 中執行gnome-terminal
。整個片段類似:
… true && cd …
cd
除了在執行整個命令的 shell 中之外,沒有理由在其他任何地方執行此操作。
您的嘗試gnome-terminal --tab -e "cd ~/code/myproject-ember"
失敗了,因為:
~
永遠不會被擴展。我知道定義別名時波浪號是單引號的。然後在別名擴充之後是雙引號。然後gnome-terminal
接收 stringcd ~/code/myproject-ember
,將其拆分為單字(不擴展波浪號)並嘗試運行生成的命令,但不是在 shell 中運行(否則最終可能會擴展波浪號)。cd
這樣跑是沒有意義的。cd …
不在 shell 中執行;這需要一個單獨的cd
可執行檔,您的作業系統中可能有也可能沒有它。即使你擁有它,即使波浪號被擴展,gnome-terminal
執行cd
它也會做它毫無意義的工作(更改它自己的目錄)並退出;在此選項卡中將不再需要執行任何操作。
gnome-terminal
在某個目錄中啟動互動式 shell 的正確方法是這裡:
gnome-terminal --working-directory=/path/to/dir
與之前類似,如果在 後獲取,則gnome-terminal
不會擴展。更好地使用and 確保它可以透過您當前的 shell 進行擴展。如果您選擇使用別名,則可能是:~
--working-directory=
$HOME
alias myproject='cd ~/code/myproject-rails && rails s & cd ~/code/myproject-ember && ember s & gnome-terminal --tab --active "--working-directory=$HOME/code/myproject-ember"'
在這種情況$HOME
下,每次別名擴展後都會擴展。
正如我所說,IMO 函數會更優雅:
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"
}
注意rails
並將ember
成為職位老的殼。我不知道它們是什麼,但是或許您希望將它們作為新 shell 中的工作。可以做到,但這裡不做詳細說明。 (如果您需要它但找不到解決方案,請提出單獨的問題。)