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-e
para informar agrep
que 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
file
conterá 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
-F
flag que eu adicionei, a variávelfile
conterá 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
file
indica 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
file
mais 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.