Como eu assíncrono define aliases ou variáveis no bash?

0

Com um projeto django, você obtém um script chamado manage.py , que possui vários subcomandos como runserver , migrate , etc. Você pode obter uma lista de todos eles executando o script sem argumentos .

Meu plano é analisar essa saída e usá-la para concluir a conclusão de TAB após . manage.py e também configurar aliases, para que eu possa digitar migr[TAB] em vez de ./manage.py migrate .

Meu problema é que, como é Python, e ele precisa carregar todo o maquinário do django para mostrar os subcomandos, estou esperando cerca de meio segundo a cada vez, em um projeto realmente pequeno. Quanto maior o projeto, mais tempo demora.

Minha ideia era executar o interrogatório do script, a definição de aliases e a configuração da autocompletar, em uma tarefa em segundo plano à la

(for subcommand in parse_manage_py; do alias $subcommand='./manage.py $subcommand'; done) &

Mas isso não define nenhuma variável no shell pai. Eu mucked com export por um tempo antes que eu descobri que as exportações "para baixo", em vez de "para cima".

    
por Adam Barnes 05.02.2017 / 02:53

1 resposta

0

Uma abordagem (deselegante) poderia ser redirecionar a saída de um processo assíncrono (que faz o trabalho lento) para um arquivo e usar o conteúdo desse arquivo somente quando você precisar dele. Você pode fazer as coisas nesse meio tempo. Por exemplo:

# placing everything into a function only because it easier to test
function func {
    # Test (I think that "runserver" is one of the alias you should get)
    echo -n "start: "
    alias -p|grep -q runserver && \
        echo \"runserver\" is defined || \
            echo \"runserver\" is NOT defined

    # prepare the aliases in background
    f=$(mktemp)
    ( python ./manage.py | \
          sed -n 's/^    \(.*\)/alias =".\/manage.py "/p'
      sleep 2  # simulate slow process
    ) >$f &
    slow_process_id=$!

    # here you can do things...
    echo "I'm doing thing..."
    sleep 1
    echo "...finished my things. Waiting for the aliases"

    # but if you need the aliases you must check that they are ready
    wait $slow_process_id
    source $f
    rm -f $f
    echo "Aliases ready :-)"

    # Test again
    echo -n "end: "
    alias -p|grep -q runserver && \
        echo \"runserver\" is defined || \
            echo \"runserver\" is NOT defined
}

Por favor, veja também coproc ... command ... , mas eu acho que suas alças de arquivo desaparecem quando o comando termina.

Eu também tentei duas abordagens erradas : primeiro eu tentei ter meu script source algumas definições de alias de um subprocesso, mas, de Claro que esses aliases não fizeram para o shell de chamada. O problema aqui é que & gera um subshell.

Depois tentei usar indireção. O problema aqui é que "indireta" variáveis não são especiais e são separadas da chamada concha.

Obrigado ao G-Man pelos comentários úteis.

    
por 29.01.2018 / 17:15