我想使用别名来启动我的 Rails/Ember 应用程序,打开一个新的终端选项卡并进入 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 中,何时使用别名,何时使用脚本,何时编写函数?
myproject
Alias 是纯文本替换。您的别名注入了太多代码,如果是函数的话会更优雅。这是一个附带“问题”。如果您愿意,可以坚持使用别名。
主要问题是你希望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
接收字符串cd ~/code/myproject-ember
,将其拆分为单词(不扩展波浪号)并尝试运行结果命令,但不在 shell 中运行(否则最终可能会扩展波浪号)。- 以这种方式运行
cd
没有意义。cd …
不是在 shell 中执行的;这需要一个单独的cd
可执行文件,您的操作系统中可能没有它。即使您有它,即使波浪符号被展开,gnome-terminal
执行cd
它也会完成其毫无意义的工作(更改其自己的目录)并退出;并且此选项卡中没有其他可做的事情。
gnome-terminal
在某个目录中启动交互式 shell 的正确方法是这里:
gnome-terminal --working-directory=/path/to/dir
与之前类似,如果在之后获得它,gnome-terminal
则不会展开。最好使用和并确保它被当前 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
将在每次别名扩展后进行扩展。
正如我所说,在我看来,一个函数会更优雅:
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 中的作业。这是可以做到的,但我不会在这里详细说明。(如果您需要它并且找不到解决方案,请提出单独的问题。)