Команды профиля Bash с несколькими проблемами ""

342
Flowinho

Добрый день!

В настоящее время я пытаюсь заставить работать следующий псевдоним. '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'

0
Я нашел решение! Привязывайся ко всему, что может быть изучено. Flowinho 7 лет назад 0

2 ответа на вопрос

0
Argonauts

Псевдоним не является правильным решением для этого - требуемые вложенные побеги станут (будут) неуправляемыми. Я бы реализовал это как функцию, используя функцию 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 будет интерпретировать символы \, $ и `. Чтобы отключить это, заключите <<EOFмаркер Heredoc в кавычки,<<'EOF'
    • Будет выведено все, что находится между двумя маркерами, включая пробелы в начале. Чтобы отступы (благо быть читаемый кодом, а не возможности скрипта), Баш лишит все ведущие вкладки из текста, если оператор Heredoc имеет приборный аргумент, то есть <<-'EOF'.
    • В каждом случае закрывающий тег heredoc должен находиться на новой строке без начальных пробелов (табуляции или иным образом).

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

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

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

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 
Это хороший и чистый подход, который я определенно постараюсь использовать в некоторых других случаях использования. TY для подробного объяснения. Flowinho 7 лет назад 0
0
Cestarian

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

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

Да, это была именно проблема. Мне удалось решить проблему, правильно избежав кавычек (с небольшим выделением синтаксиса vim), но я полагаю, что поместить его в другой скрипт-скрипт - это путь. Flowinho 7 лет назад 0