Вопрос или проблема
У меня есть очень простой скрипт, который я использую, чтобы открыть Терминал из Xcode в корневой папке проекта:
#!/bin/bash
open -a Terminal "`pwd`"
Я хочу расширить его, чтобы выполнить команду pod install
, поэтому я добавил &&, чтобы выполнить её.
#!/bin/bash
open -a Terminal "`pwd`" && pod install
Однако вторая команда не выполняется. Я пробовал с одной &, помещал pod install в другой скрипт и пытался вызвать его, но мне не удалось выполнить это. Как можно это сделать?
Думаю, что так как Xcode запускает скрипт для открытия терминала, терминал не знает о pod install, так что возможно, если есть способ передать входной параметр в терминал, это было бы полезно.
Во-первых, обратные кавычки не имеют смысла. Они вызывают выполнение текущей директории как команды.
Далее, && — это разделитель операторов. Вы по сути выполнили
open -a Terminal "`pwd`"
pod install
с единственной разницей, что pod
в вашем случае выполняется только если open
возвращает код завершения ноль. Это значит, что команда pod
не выполняется внутри терминала.
Теперь, я предполагаю, что вы хотите запустить pod install
в новом окне терминала. Вы можете передать open -a Terminal
путь к выполняемому файлу, так что
open -a Terminal "pod install"
не сработает, потому что нет исполняемого файла с именем pod install
. Вместо этого вы бы создали где-нибудь (скажем, в вашем ~/bin
) скрипт, который выполняет эту задачу, то есть.
У вас есть исполняемый скрипт ~/pod_inst
, который содержит, например
#!/bin/zsh
pod install
и запустите его как
open -a Terminal ~/bin/pod_inst
Вещи усложняются, если скрипту требуются динамические аргументы. Скажем, что вы хотите запустить скрипт в рабочей директории, из которой вы вызываете open
(по умолчанию новый терминал будет запускать его в вашей домашней директории). К сожалению, передача этой информации через окружение не работает (потому что open
действует так, как если бы вы щелкнули на значок Терминала на своем рабочем столе, что означает, что вы получаете новую среду).
Для передачи переменных, вы могли бы сделать ваш pod_inst так, чтобы он принимал конфигурационный файл с именем, о котором вы договорились. Скрипт теперь становится таким:
#!/bin/zsh
conf_file=~/.pod_inst
[[ -f $conf_file ]] && source $conf_file
if [[ -n $wd ]] && cd $wd
pod install
Чтобы pod install
был выполнен в вашей текущей рабочей директории, вы теперь делаете
echo wd="$PWD" >~/.pod_inst # Создайте конфигурацию ...
open -a Terminal ~/bin/pod_inst # Запустите скрипт в новом терминале
(Я не пробовал это, просто узнал из страницы man)
Я предполагаю, что проблема в том, что загрузчик запускает команду терминала, а затем запускает команду pod, а не наоборот. Я думаю, что вы хотите запустить команду pod в самом терминале.
Попробуйте
#!/bin/bash
open -a Terminal "`pwd`" -e "pod install"
.
Ответ или решение
Чтобы ответить на вопрос о том, как запустить команду после открытия окна терминала из скрипта с использованием Bash, необходимо учитывать несколько нюансов, связанных с оболочкой и работой терминала в системе macOS.
Проблема
Вы хотите открыть терминал из среды Xcode в корневом каталоге проекта и автоматически выполнить команду pod install
. Ваш нынешний подход:
#!/bin/bash
open -a Terminal "`pwd`" && pod install
Этот скрипт вызывает две отдельные команды, но pod install
не выполняется в контексте нового окна терминала. Это происходит потому, что команду pod install
система пытается выполнить в текущем контексте, а не в новом окне терминала.
Решение
1. Используйте скрипт для выполнения команды в терминале
Чтобы выполнить команду pod install
в новом окне терминала, нужно передать ей соответствующий скрипт. Одна из возможностей — создать специальный скрипт, который будет вызываться в новом терминале.
Шаги:
-
Создайте скрипт выполнения:
Создайте отдельный Bash-скрипт, например,
pod_inst.sh
:#!/bin/bash cd "$1" # Переходим в нужную директорию, переданную при вызове pod install
-
Сделайте скрипт исполняемым:
chmod +x /path/to/pod_inst.sh
-
Запустите новый скрипт в терминале:
Измените основной скрипт на следующий:
#!/bin/bash open -a Terminal "/path/to/pod_inst.sh" "`pwd`"
2. Передача параметров в терминал
Альтернативный способ — передать команду на выполнение непосредственно в вызов Terminal
. Это делается с помощью утилиты osascript
, которая позволяет передавать команды напрямую Terminal.app.
Пример использования osascript
:
#!/bin/bash
osascript -e "tell application \"Terminal\" to do script \"cd `pwd`; pod install\""
Этот скрипт:
- Открывает новое окно терминала
- Выполняет команды
cd
(переход в текущий рабочий каталог) иpod install
Заключение
Для автоматизации и упрощения рабочих процессов важно понимать, как работает вызов системных команд в macOS и как можно передавать команды для выполнения в новом контексте. Подходы, описанные выше, позволяют интегрировать выполнение команды в вашем рабочем процессе с Xcode и macOS. Это решение не только эффективно, но и значительно упрощает процесс разработки, устраняя рутину ручных вызовов.
Таким образом, используя эти рекомендации, вы сможете повысить производительность и оптимизировать свои действия в среде разработки.