Vários problemas aqui:
-
Você não está citando sua variável. Isto significa que o que quer que o usuário passe será submetido (após a expansão do parâmetro) à divisão de palavras no espaço em branco e à expansão glob. Isso vai quebrar as coisas. Veja:
-
A entrada do usuário pode começar com um hífen. Em caso afirmativo, ele será interpretado como uma opção para
grep. Para evitar isso, use a opção-epara informar agrepque o argumento é especificamente um padrão de pesquisa, não importa o que pareça. -
Você está usando a pesquisa de regex. Você provavelmente deseja uma pesquisa de texto fixa, não regex. Então use
-F. -
Backticks são obsoletos. Use
$(...)em vez disso. Veja também:
Colocando esses pontos juntos, você terá um código mais parecido com:
read -p "Enter new path or type 'exit': " ans
file="$(grep -Fxe "$ans" ~/.Log)"
Mas agora chegamos aos problemas adicionais:
-
A variável
fileconterá apenas exatamente o que o usuário digitou, de qualquer forma. Ou possivelmente não conterá nada. Ou possivelmente conterá várias cópias do que o usuário digitou, delimitadas por novas linhas.Se omitirmos o
-Fflag que eu adicionei, a variávelfileconterá apenas correspondências de linha completa da regex que o usuário digitou.Nenhuma dessas coisas são necessariamente arquivos. O fato de você ter chamado a variável
fileindica que você tem alguma outra expectativa para o que o código faz do que o que realmente faz . -
Também há muitos problemas potenciais associados ao uso de
read, o que pode não importar para o seu script, mas você deve pelo menos estar ciente deles; veja:(Embora essa postagem discuta o uso de um loop shell para processar o texto, o que você não está fazendo, também explica com bons exemplos algumas das peculiaridades envolvidas no uso de
read.) -
Além disso, o que você está fazendo com essa variável
filemais tarde pode ser muito mais simplesmente realizado com um pipeline.
Eu não posso levar isso adiante, porque eu não sei como é o resto do seu roteiro.