Limite di caratteri della riga di comando di Linux


27

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.


1
Non capisco la domanda. Sei interessato al limite dei personaggi?
Krissi,

Devi dichiarare la tua domanda in modo più chiaro, altrimenti verrà chiusa.
ThatGraemeGuy

Risposte:


27

Il limite imposto dalla shell / sistema operativo è generalmente molto lungo - di solito uno o duecentomila caratteri.

getconf ARG_MAXti 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.


2
Sul mio sistema, getconf ARG_MAXfornisce 2097152, ma la lunghezza massima di arg che posso passare è ancora 131071 (e non devo dedurre la dimensione dell'ambiente).
In pausa fino a nuovo avviso.

1
Ricorda anche che xargse find -execsono anche i tuoi amici quando hai a che fare con liste di argomenti giganti.
coredump,

@Dennis: il valore restituito da 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.
David Spillett,

Ottengo gli stessi risultati in ksh, zsh, dash, fishe Bash 3 come ho fatto in Bash 4. Il messaggio di errore da fishpotrebbero 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.
In pausa fino a nuovo avviso.

11

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


1

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

2
In realtà questo è un valore variabile molto lungo .
In pausa fino a nuovo avviso.

3
Inoltre, non è necessario utilizzare perle uno script:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
In pausa fino a nuovo avviso.

@DennisWilliamson tuttavia, printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/nullfunziona.
jarno,

Questo perché printfè una shell integrata, quindi bashnon è necessario eseguirne una exec()per generare un altro processo. ARG_MAXconta solo per la lunghezza della lista degli argomenti delle execfunzioni ( exec(), execl(), execlp(), execvp(), execvpe(), etc.).
Vicente Olivert Riera,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.