O início do Bash é lento devido a esta linha em .bashrc. O que poderia causar isso?

19

Meu .bashrcarquivo contém uma linha para esse efeito:

alias prog="/path/to/script.sh $(find $(pwd) -name prog)"

Quando eu comento essa linha, o Bash começa quase instantaneamente quando abro um novo terminal. Com esta linha, há um atraso de 4-5 segundos antes do meu cursor aparecer.

A remoção dos comandos aninhados $(pwd)etc. também acelera novamente. Por que isso está acontecendo? Ainda posso usar comandos aninhados de alguma forma?

BBales
fonte
4
O problema é o findcomando, que é executado no momento da inicialização e pode levar muito tempo para ser executado, dependendo da estrutura do diretório. Se você usar aspas simples, em vez de aspas duplas, findserá executado em tempo de execução, quando o valor aliasfor invocado. Depende do diretório de trabalho que você deseja usar, da corrente no momento da declaração ou no tempo de execução. A propósito, $(pwd)é uma maneira bastante ineficiente de expressar .ou $PWD.
AFH 14/05
15
Eu sei que não é isso que você está perguntando, mas isso parece muito com um problema XY . Por que você precisa localizar o script usando find? Depois de instalá-lo, você sabe onde ele está. Mesmo se você atualizá-lo com frequência e alterar seu nome, poderá manter um link simbólico para que ele esteja sempre disponível com um nome fixo.
Sleske # 15/17
5
@ AFH Por favor, poste respostas como respostas, não como comentários.
David Richerby
11
@DavidRicherby - Eu queria ter certeza de que essa era realmente a resposta antes de postar. Fiquei intrigado ao saber que o script funcionaria em arquivos encontrados em um diretório arbitrário.
AFH

Respostas:

45

Como a substituição do comando está entre aspas duplas, ela é avaliada no momento em que o comando é definido. Isso faz findcom que você examine o conteúdo do disco rígido enquanto .bashrcestiver em execução.

Você, pelo contrário, parece querer que ela seja avaliada no momento do uso. Nesse caso, use aspas simples:

alias prog='/path/to/script.sh $(find "$(pwd)" -name prog)'

Observe que esse alias falhará se algum dos arquivos encontrados tiver espaço em branco em seus nomes. Para evitar isso:

alias prog='find . -name prog -exec /path/to/script.sh {} +'

Este último formulário funcionará de maneira confiável para qualquer tipo de nome de arquivo.

John1024
fonte
11
'tempo de uso'. E sua segunda linha evita gerar um subshell.
Rlir
11
No lado negativo, agora, toda vez que você digita prog, findprecisaria ser executado, enquanto antes, seria executado apenas uma vez (na inicialização do shell).
El.pescado 15/05
Por outro lado, devido ao armazenamento em cache de arquivos, na segunda vez em que você executa o mesmo find, geralmente é muito mais rápido.
Reinierpost
21
@ el.pescado Por outro lado, é difícil imaginar que o comportamento pretendido seja executar o comando nos arquivos existentes no momento em que o usuário efetuou login, em vez dos arquivos existentes quando executaram o comando para processá-los.
David Richerby
2
@DavidRicherby Talvez possamos armazenar em cache o caminho proge executar novamente findse o caminho antigo não existir mais?
Alex Vong