In che modo zsh espande esattamente i globs?
-
22-07-2019 - |
Domanda
Ho un programma C che mostra la sua riga di comando ripetendo la variabile argv
.
#include <stdio.h>
int main(int argc, char *argv[]){
int i = 0;
printf("----------\n");
for(i = 0; i < argc; i++)
printf("%s\n", argv[i]);
return 0;
}
Ho invocato il programma in una cartella contenente un grande albero dei sorgenti C ++ come questo:
./a.out **/*.h
L'output:
zsh: argument list too long: ./a.out
Tuttavia, programmi come ls
e grep
funzionano senza problemi quando vengono richiamati usando il glob ** / *. h
nella stessa cartella . Perché zsh
non riesce quando si richiama il mio programma? Come funziona zsh
sull'espansione dei caratteri jolly?
Modifica: sto usando zsh su cygwin.
Soluzione
L'applicazione che hai provato a eseguire un'app di Windows (inclusa mingw) o un'app Cygwin?
ARG_MAX definisce quanto può essere lunga la riga di comando. Di solito è impostato dal sistema operativo e tutte le applicazioni sono limitate ad esso, ma sulle applicazioni Cygwin compilate per Cygwin possono utilizzare un buffer più grande rispetto alle app di Windows - vedere questo messaggio per una discussione di esempio.
Se non hai necessariamente tutti i file richiesti come args allo stesso tempo, puoi usare xargs per partizionare i nomi dei file in blocchi che si adattano ad ARG_MAX:
echo **/*.h | xargs ./a.out
Altri suggerimenti
Ho compilato il tuo codice ed eseguito nella directory corrente in un modo simile e ha funzionato bene senza alcun messaggio di errore. Inoltre mi sono imbattuto in questo messaggio pubblicato da qualcuno che suggerisce che il messaggio di errore "elenco argomenti troppo lungo" non esiste nel codice Souce per zsh, quindi potrebbe effettivamente essere un problema del sistema operativo: http : //www.zsh.org/mla/workers/1996/msg00060.html