Как создать сложный псевдоним (запустить Ember, запустить Rails и сменить каталог) в Ubuntu 20.10.4

Как создать сложный псевдоним (запустить Ember, запустить Rails и сменить каталог) в Ubuntu 20.10.4

Я хотел бы использовать псевдоним для запуска моего приложения 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он был функцией. Это побочная «проблема». Вы можете придерживаться псевдонима, если хотите.

Основная проблема в том, что вы ожидаете cd ~/code/myproject-emberработать в недавно открытой вкладке. Когда ваш псевдоним заменяется myprojectна

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

и этот код выполняется, тот факт, что gnome-terminalон выполняется, не приведет к внедрению следующей команды ( cd ~/code/myproject-ember) в командную строкутам. cdбудет выполнен в текущей оболочке после gnome-terminalуспешного завершения этого конкретного процесса. Весь фрагмент похож на:

… true && cd …

и нет никаких причин, по которым это cdдолжно выполняться где-либо еще, кроме как в оболочке, которая выполняет всю команду.

Ваша попытка gnome-terminal --tab -e "cd ~/code/myproject-ember"не удалась, потому что:

  • ~никогда не расширяется. Я понимаю, что тильда заключается в одинарные кавычки, когда вы определяете псевдоним. Затем после расширения псевдонима этов двойных кавычках. Затем gnome-terminalполучает строку cd ~/code/myproject-ember, разбивает ее на слова (без раскрытия тильды) и пытается выполнить полученную команду, но не в оболочке (которая в противном случае могла бы в конечном итоге раскрыть тильду).
  • Запуск cdтаким образом не имеет смысла. cd …выполняется не в оболочке; для этого требуетсяотдельный cdисполняемый файл, он может быть или не быть в вашей ОС. Даже если бы он был у вас и даже если бы тильда была раскрыта, gnome-terminalон выполнил бы cdсвою бессмысленную работу (изменил бы свой собственный каталог) и вышел бы; и в этой вкладке больше нечего было бы делать.

Правильный способ запустить gnome-terminalинтерактивную оболочку в каком-либо каталоге:здесь:

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

Аналогично, как и раньше, gnome-terminalне будет расширяться, ~если он получает его после --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станут рабочими местами встарыйракушка. Я не знаю, что это такое, номожет бытьвы хотели бы иметь их как задания в новой оболочке. Это можно сделать, но я не буду здесь вдаваться в подробности. (Если вам это нужно и вы не нашли решения, задайте отдельный вопрос.)

Связанный контент