Quero encontrar todos os arquivos em um diretório que contenha -2
.
Usando ls | grep "-2"
retornosusage: grep...
Usar aspas simples em vez de aspas duplas retorna o mesmo, e também não usar aspas, enquanto a pesquisa por qualquer outra coisa retorna corretamente os nomes de arquivos correspondentes.
Pelo que me lembro, -
não é um caractere especial regex.
Por favor, não se concentre no problema específico de encontrar arquivos com um nome. Quero principalmente entender por que o grep está se comportando dessa maneira.
Usando bash no macOS 10.13
Responder1
É como se estivesse interpretando -2 como um parâmetro de linha de comando, independentemente de estar entre aspas.
grep
não sabese um parâmetro está entre aspas ou não.
Muitas etapas de análise são executadas pelo próprio shell 1 antes de executar qualquer coisa – >
redirecionamentos são aplicados, $
variáveis são expandidas, *
curingas são expandidos, |
pipelines são divididos em um conjunto de comandos individuais e cada comando é dividido em uma matriz de palavras.
Portanto, quer você execute grep -2
, grep '-2'
, grep \-2
ou mesmo x=-2; grep $x
, o shell ainda o verá como a mesma lista de parâmetros: { grep
, -2
}. Isto é o que será passado para a chamada do sistema execv(), e é isso que ogrepprograma receberá em seu argv[]
array, independentemente da cotação original.
1 Mesmo no Windows, onde a linha de comando em CreateProcess() é apenas uma única string, a maioria das portas dogrepainda terá esse comportamento porque a biblioteca de tempo de execução C executa a mesma divisão de argumentos durante a inicialização.