Sto passando una variabile a uno script dalla riga di comando. Qual è il limite di caratteri di un comando? per esempio:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Grazie.
Sto passando una variabile a uno script dalla riga di comando. Qual è il limite di caratteri di un comando? per esempio:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Grazie.
Risposte:
Il limite imposto dalla shell / sistema operativo è generalmente molto lungo - di solito uno o duecentomila caratteri.
getconf ARG_MAX
ti darà il limite massimo di input per un comando. Sul sistema Debian attualmente ho un terminale aperto su questo restituisce 131072 che è 128 * 1024. Il limite viene ridotto dalle variabili di ambiente, come se la mia memoria mi servisse correttamente, queste vengono passate nella stessa struttura dalla shell, anche se nella maggior parte dei casi toglieranno solo poche centinaia di caratteri. Per trovare un'approssimazione di questo valore esegui env | wc -c
- questo suggerisce 325 caratteri al momento attuale su questo login su questa macchina.
È probabile che gli script consentano questa lunghezza completa, ma non è improbabile che altre utilità impongano i propri limiti intenzionalmente o attraverso problemi di progettazione. Potrebbero esserci anche limiti artificiali alla lunghezza di un singolo argomento su una lunga riga di comando e / o alla lunghezza di un percorso di un file.
getconf ARG_MAX
fornisce 2097152, ma la lunghezza massima di arg che posso passare è ancora 131071 (e non devo dedurre la dimensione dell'ambiente).
xargs
e find -exec
sono anche i tuoi amici quando hai a che fare con liste di argomenti giganti.
getconf
è il livello del kernel penso. Forse bash sta impostando un limite inferiore dal suo design / configurazione? Inoltre, la mia conoscenza di questo proviene da qualche tempo fa, quindi potrebbe essere che le cose siano cambiate un po 'di recente, anche se non è un'area in cui mi aspetto di vedere molti movimenti tranne che in nuove shell sperimentali.
ksh
, zsh
, dash
, fish
e Bash 3 come ho fatto in Bash 4. Il messaggio di errore da fish
potrebbero essere informativo: "pesce: La dimensione totale delle liste di argomenti e ambiente (130KB) supera il limite del sistema operativo di 2.0MB ". Tuttavia, set | wc -c
è 306317 ed env | wc -c
è 2507 che non rappresentano la differenza. Non so cos'altro viene contato.
ARG_MAX in effetti limita la dimensione totale della riga di comando e dell'ambiente, ma stai affrontando una limitazione aggiuntiva: un argomento non deve essere più lungo di MAX_ARG_STRLEN (che purtroppo è hardcoded per essere 131072).
Vedi /unix/120642/what-defines-the-ma maximum- size- for-a- command- single- argument
Intendi qual è la lunghezza variabile più lunga? Per capirlo puoi usare la "x" di perl per creare un nome di variabile molto lungo:
VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR
Sul mio sistema 131071 funziona:
e la variabile è stampata a 131072 è troppo grande:
VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long
perl
e uno script:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
funziona.
printf
è una shell integrata, quindi bash
non è necessario eseguirne una exec()
per generare un altro processo. ARG_MAX
conta solo per la lunghezza della lista degli argomenti delle exec
funzioni ( exec()
, execl()
, execlp()
, execvp()
, execvpe()
, etc.).