Uso {html,php,htm}
può funzionare solo come brace expansion, che è una caratteristica non standard (non POSIX) di bash
, ksh
e zsh
.
Per un'espansione tutore per essere riconosciuto, è deve essere un unquoted (parte di) gettone sulla linea di comando.
Un'espansione delle parentesi graffe espande a più argomenti, così nel caso in esame grep
finisce per vedere multipla--include=...
opzioni, proprio come se fossero stati passati singolarmente.
I risultati di un'espansione delle graffe sono soggette a globbing (espansione dei nomi), che ha insidie :
Ogni argomento risultante potrebbe essere ulteriormente espansa per corrispondenza nomi se succede a contenere non quotati metacaratteri globbing come *
.
Anche se è improbabile con token come --include=*.html
(ad es. Dovresti avere un file chiamato letteralmente qualcosa come --include=foo.html
per qualcosa che corrisponde), vale la pena tenerlo a mente in generale.
Se l'opzione di shell nullglob
sembra essere acceso (shopt -s nullglob
) e glob partite nulla, l'argomento sarà scartato .
Pertanto, per una soluzione completamente robusto, utilizzare il seguente:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
è considerato un letterale, a causa di essere apici singoli; questo impedisce interpretazioni involontarie di *
come un personaggio globbing.
{html,php,htm}
, la - necessariamente - unquoted espansione delle graffe [1] , espande per argomenti, che, a causa di {...}
direttamente seguenti la '...'
gettone, includono quel segno.
Pertanto, dopo la rimozione citazione dalla shell, seguente letterali argomenti vengono infine trasferiti alla grep
:
--include=*.html
--include=*.php
--include=*.htm
[1] Più precisamente, è solo sintassi rilevanti parti dell'espansione tutore che deve essere non quotate, i elementi dell'elenco potrebbero ancora essere citati singolarmente e devono essere se contengono metacaratteri globbing che potrebbero causare globbing indesiderati dopo l'espansione brace; anche se non necessario in questo caso, quanto sopra potrebbe essere scritto come
'--include=*.'{'html','php','htm'}
Vedo il problema. Ho usato --include = "*. {Html, php}" per impedire alla shell di espandere '*' che allo stesso tempo interrompe la shell per espandere {html, php}. Sembra che il segno di uguale in --include = * sia in grado di impedire alla shell di espandere '*'. – tianyapiaozi
xargs non è davvero un sostituto; molte volte quando hai bisogno di questa funzione, hai a che fare con più file di quelli gestiti da xargs. –
@JamesMoore: date un'occhiata a [GNU Parallel] (https://www.gnu.org/software/parallel/). Può spesso essere usato come sostituto di 'xargs'. [Questo] (https://www.gnu.org/software/parallel/man.html#differences_between_xargs_and_gnu_parallel) vale anche una lettura veloce. HTH. – Steve