如何在 Ubuntu 20.10.4 中创建复杂别名(启动 Ember、启动 Rails 和更改目录)

如何在 Ubuntu 20.10.4 中创建复杂别名(启动 Ember、启动 Rails 和更改目录)

我想使用别名来启动我的 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 中,何时使用别名,何时使用脚本,何时编写函数?

myprojectAlias 是纯文本替换。您的别名注入了太多代码,如果是函数的话会更优雅。这是一个附带“问题”。如果您愿意,可以坚持使用别名。

主要问题是你希望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 中的作业。这是可以做到的,但我不会在这里详细说明。(如果您需要它并且找不到解决方案,请提出单独的问题。)

相关内容