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