Comandos do perfil Bash com vários problemas ""

0

Bom dia!

Atualmente, estou tentando fazer com que o seguinte alias funcione. 'git_fetch' e 'git_tree' são apelidos personalizados, então não se preocupe com eles.

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'

(adicionei quebras de linha para aumentar a legibilidade)

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'

No entanto, eu não consigo fazer isso funcionar. Recarregando os resultados de ~ / .profile em:

-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

Alguém pode me ajudar? :)

EDIT : Eu encontrei a solução!

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'

    
por Flowinho 09.12.2016 / 08:46

2 respostas

0

Bem, o problema é que o formato do alias é algo assim:

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

Em outras palavras, os comandos do alias devem ser fechados entre aspas.

Você tem isso:

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'

Agora há um grande problema que nesse comando excessivamente longo você tem muitas aspas entre elas. Então, seu alias será realmente lido assim

alias git_workspace='osascript -e '

E como você tem todos esses comandos finais depois desse bit, ele quebra seu arquivo bash_profile.

A maneira mais fácil de contornar isso, que eu pessoalmente uso sempre, é criar o script em um arquivo separado, essencialmente colando o seguinte em um arquivo vazio.

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

Você pode nomear o arquivo git_workspace.sh ou git_workspace ou qualquer outra coisa, o nome depende de você e, em seguida, é necessário conceder às permissões de execução de arquivo

chmod +x git_workspace.sh

Depois disso, teste o script para ter certeza de que funciona, assim

/path/to/git_workspace.sh

E se ele for executado da maneira pretendida, vá para o arquivo do perfil bash e crie esse alias

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

E então vai funcionar. É claro que há muitas outras maneiras de contornar isso, mas é isso que eu acho ser o mais simples, criei um diretório .scripts no diretório home e coloquei todos os scripts que criei ao longo dos anos lá. Isso também facilita o backup dos meus scripts, caso eu queira trocar de computador ou reinstalar o sistema operacional.

    
por 09.12.2016 / 13:23
0

Um alias não está na solução certa para isso - as saídas aninhadas que são necessárias se tornarão incontroláveis. Eu implementaria isso como uma função usando um recurso bash chamado de Heredoc em uma função:

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
}
  • O osascript verá a entrada heredoc como um arquivo em vez de um argumento de sequência, portanto, o argumento -e não é necessário.
  • A instrução Heredoc exibirá o texto exatamente como está escrito entre os marcadores <<EOF e EOF , com as seguintes ressalvas:
    • Por padrão, um heredoc irá interpretar os caracteres \, $ e '. Para desabilitar isso, coloque o marcador Heredoc <<EOF entre aspas, <<'EOF'
    • Tudo entre os dois marcadores será exibido, incluindo o espaço em branco inicial. Para permitir recuo (o benefício é legível ao invés de recurso de script), o bash removerá todas as guias principais do texto se o operador heredoc tiver um argumento de traço, ou seja, <<-'EOF' .
    • Em todos os casos, a tag heredoc de fechamento deve estar em uma nova linha sem espaços em branco iniciais (guias ou outros).

Se você usar essa abordagem, poderá digitar os comandos osascript exatamente como seriam emitidos nativamente sem ter que resolver nenhum problema com a expansão / substituição do bash.

Eu envolvi as duas sequências de comando do osascript em um subshell para facilitar o redirecionamento da saída.

Se você quiser ver como é o texto / argumento para os os osascript, modifique a função temporariamente substituindo osascript por cat e remova o redirecionamento para / dev / null. Como a função está escrita agora, a saída é assim:

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
    
por 09.12.2016 / 12:07