echo "*file 2" | grep -o ^.
imprime *
.
Como você tem uma substituição de comando fora de aspas duplas, ele passa por globbing (geração de nome de arquivo a.k.a. curinga correspondente a.k.a.) e divisão de palavras. Se o diretório atual não estiver vazio, *
será expandido para a lista de arquivos no diretório atual. Cada arquivo se torna um token no comando [
, o que é altamente provável que seja um erro de sintaxe.
O problema é que você não usou aspas duplas em torno da substituição de comando. Sempre use aspas duplas em torno de substituições de variáveis e comandos , a menos que você tenha um bom motivo para omiti-las.
if [ "$(echo "*file 2" | grep -o ^.)" = '.' ]
Veja Por que meu script de shell sufoca em espaço em branco ou outros caracteres especiais? para uma explicação mais detalhada.