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?


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.