Добрый день!

В настоящее время я пытаюсь заставить работать следующий псевдоним. 'git_fetch' и 'git_tree' являются пользовательскими псевдонимами, поэтому не беспокойтесь о них.

alias git_workspace='osascript -e 'tell application "Terminal"' -e 'tell application "System Events" to tell process "Terminal" to keystroke "n" using command down' -e "do script with command \"cd `pwd`;clear && git_fetch\" in selected tab of the front window" -e 'end tell' &> /dev/null && osascript -e 'tell application "Terminal"' -e 'tell application "System Events" to tell process "Terminal" to keystroke "n" using command down' -e "do script with command \"cd `pwd`;clear && git_tree\" in selected tab of the front window" -e 'end tell' &> /dev/null'

(Я добавил разрывы строк, чтобы улучшить читаемость)

alias git_workspace='osascript -e 'tell application "Terminal"' 
-e 'tell application "System Events" to tell process "Terminal" 
to keystroke "n" using command down' -e "do script with command \"cd `pwd`;clear 
&& git_fetch\" in selected tab of the front window" -e 'end tell' 
&> /dev/null 
&& osascript -e 'tell application "Terminal"' -e 'tell application "System Events" 
to tell process "Terminal" to keystroke "n" using command down' 
-e "do script with command \"cd `pwd`;clear && git_tree\" 
in selected tab of the front window" -e 'end tell' &> /dev/null'

Однако я не могу заставить это работать. Перезагрузка ~/.profile приводит к:

-bash: alias: application: not found
-bash: alias: Terminal -e tell: not found
-bash: alias: application: not found
-bash: alias: System Events: not found
-bash: alias: to: not found
-bash: alias: tell: not found
-bash: alias: process: not found
-bash: alias: Terminal: not found
-bash: alias: to: not found
-bash: alias: keystroke: not found
-bash: alias: n: not found
-bash: alias: using: not found
-bash: alias: command: not found
-bash: alias: down -e "do script with command \"cd `pwd`;clear && git_fetch\" in selected tab of the front window" -e end: not found
-bash: alias: tell &> /dev/null && osascript -e tell: not found
-bash: alias: application: not found
-bash: alias: Terminal -e tell: not found
-bash: alias: application: not found
-bash: alias: System Events: not found
-bash: alias: to: not found
-bash: alias: tell: not found
-bash: alias: process: not found
-bash: alias: Terminal: not found
-bash: alias: to: not found
-bash: alias: keystroke: not found
-bash: alias: n: not found
-bash: alias: using: not found
-bash: alias: command: not found
-bash: alias: down -e "do script with command \"cd `pwd`;clear && git_tree\" in selected tab of the front window" -e end: not found
-bash: alias: tell &> /dev/null: not found

Может ли кто-нибудь помочь мне? :)

РЕДАКТИРОВАТЬ: Я нашел решение!

alias git_workspace='osascript -e "tell application \"Terminal\"" -e "tell application \"System Events\" to tell process \"Terminal\" to keystroke \"n\" using command down" -e "do script with command \"cd `pwd`;clear && git_fetch\" in selected tab of the front window" -e "end tell" &> /dev/null && osascript -e "tell application \"Terminal\"" -e "tell application \"System Events\" to tell process \"Terminal\" to keystroke \"n\" using command down" -e "do script with command \"cd `pwd`;clear && git_tree\" in selected tab of the front window" -e "end tell" &> /dev/null'

2 ответа2

0

Псевдоним не является правильным решением для этого - требуемые вложенные побеги станут (будут) неуправляемыми. Я бы реализовал это как функцию, используя функцию bash под названием Heredoc в функции:

git_workspace () {
(
  osascript <<-'EOF'
        tell application "Terminal"' 
        tell application "System Events" to tell process "Terminal" to keystroke "n" using command down
        do script with command "cd `pwd`;clear && git_fetch" in selected tab of the front window
        end tell
EOF

  if [ $? -eq 0 ]; then
        osascript <<-'EOF'
            tell application "Terminal"
            tell application "System Events" to tell process "Terminal" to keystroke "n" using command down
            do script with command "cd `pwd`;clear && git_tree" in selected tab of the front window
            end tell
EOF
   fi
)  &>/dev/null
}
  • osascript будет видеть ввод heredoc в виде файла, а не строкового аргумента, поэтому аргумент -e не требуется.
  • Оператор Heredoc выведет текст в точности так, как он написан между маркерами <<EOF и EOF , со следующими оговорками:
    • По умолчанию heredoc будет интерпретировать символы \, $ и `. Чтобы отключить это, заключите маркер Heredoc <<EOF в кавычки, <<'EOF'
    • Будет выведено все, что находится между двумя маркерами, включая пробелы в начале. Чтобы разрешить отступ (преимущество заключается в читаемости кода, а не в возможности скрипта), bash удалит все ведущие вкладки из текста, если у оператора heredoc есть аргумент дефиса, то есть <<-'EOF' .
    • В каждом случае закрывающий тег heredoc должен находиться на новой строке без начальных пробелов (табуляции или иным образом).

Если вы используете этот подход, вы можете вводить команды osascript в точности так, как они будут выполняться изначально, без необходимости решать какие-либо проблемы с расширением / заменой bash.

Я обернул обе последовательности команд osascript в подоболочку, чтобы упростить перенаправление вывода.

Если вы хотите увидеть, как выглядит текст / аргумент для osascript, временно измените функцию, заменив osascript на cat и удалите перенаправление на / dev / null. Как функция написана сейчас, вывод выглядит так:

tell application "Terminal"' 
tell application "System Events" to tell process "Terminal" to keystroke "n" using command down
do script with command "cd `pwd`;clear && git_fetch" in selected tab of the front window
end tell
tell application "Terminal"
tell application "System Events" to tell process "Terminal" to keystroke "n" using command down
do script with command "cd `pwd`;clear && git_tree" in selected tab of the front window
end tell
0

Проблема в том, что формат псевдонима выглядит примерно так:

alias thing='commands'
alias thingy="commands"

Другими словами, команды псевдонима должны быть заключены в кавычки.

Вы получили это:

alias git_workspace='osascript -e 'tell application "Terminal"' -e 'tell application "System Events" to tell process "Terminal" to keystroke "n" using command down' -e "do script with command \"cd `pwd`;clear && git_fetch\" in selected tab of the front window" -e 'end tell' &> /dev/null && osascript -e 'tell application "Terminal"' -e 'tell application "System Events" to tell process "Terminal" to keystroke "n" using command down' -e "do script with command \"cd `pwd`;clear && git_tree\" in selected tab of the front window" -e 'end tell' &> /dev/null'

Теперь существует огромная проблема в том, что в этой чрезмерно длинной команде между вами слишком много кавычек. Таким образом, ваш псевдоним действительно будет читаться так

alias git_workspace='osascript -e '

А поскольку после этого бита у вас есть все эти команды, они ломают ваш файл bash_profile.

Самый простой способ обойти это, что я лично всегда использую, состоит в том, чтобы создать сценарий в отдельном файле, по сути вставив следующее в пустой файл.

osascript -e 'tell application "Terminal"' -e 'tell application "System Events" to tell process "Terminal" to keystroke "n" using command down' -e "do script with command \"cd `pwd`;clear && git_fetch\" in selected tab of the front window" -e 'end tell' &> /dev/null && osascript -e 'tell application "Terminal"' -e 'tell application "System Events" to tell process "Terminal" to keystroke "n" using command down' -e "do script with command \"cd `pwd`;clear && git_tree\" in selected tab of the front window" -e 'end tell' &> /dev/null

Вы можете назвать файл git_workspace.sh или git_workspace или как угодно, имя зависит от вас, тогда вам нужно дать разрешения на выполнение файла с

chmod +x git_workspace.sh

После этого протестируйте скрипт, чтобы убедиться, что он работает, запустив его, вот так

/path/to/git_workspace.sh

И если он выполняется так, как вы хотели, перейдите в файл профиля bash и создайте этот псевдоним.

alias git_workspace='/path/to/git_workspace.sh'

И тогда это будет работать. Конечно, есть много других способов обойти это, но это то, что я считаю самым простым, я создал каталог .scripts в своем домашнем каталоге и поместил в него все скрипты, которые я создал за эти годы. Это также облегчает резервное копирование моих сценариев на случай, если я захочу переключить компьютеры или переустановить мою ОС.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .