Batas karakter baris perintah Linux

27

Saya meneruskan variabel ke skrip di baris perintah. Berapa batas karakter perintah? misalnya:

$ MyScript reallyreallyreally...reallyreallyreallylongoption

Terima kasih.

Robdog
sumber
1
Saya tidak mengerti pertanyaannya. Apakah Anda tertarik dengan batas karakter?
krissi
Anda perlu menyatakan pertanyaan Anda dengan lebih jelas, kalau tidak hanya akan ditutup.
ThatGraemeGuy

Jawaban:

27

Batas yang dikenakan shell / OS umumnya sangat panjang - biasanya satu atau dua ratus ribu karakter.

getconf ARG_MAXakan memberi Anda batas input maksimum untuk suatu perintah. Pada sistem Debian saya saat ini memiliki terminal terbuka pada pengembalian ini 131072 yang merupakan 128 * 1024. Batas dikurangi oleh variabel lingkungan Anda seolah ingatan saya melayani saya dengan benar, ini dilewatkan dalam struktur yang sama oleh shell, meskipun itu hanya akan menghapus beberapa ratus karakter dalam banyak kasus. Untuk menemukan perkiraan jangka nilai ini env | wc -c- ini menunjukkan 325 karakter pada saat ini saat login ini di mesin ini.

Skrip cenderung mengizinkan panjang penuh ini, tetapi bukan tidak mungkin bahwa utilitas lain akan memaksakan batas mereka sendiri baik secara sengaja atau melalui masalah desain. Mungkin juga ada batas artifisial untuk berapa lama argumen individu pada baris perintah panjang dapat, dan / atau berapa lama jalur ke file bisa.

David Spillett
sumber
2
Pada sistem saya, getconf ARG_MAXberikan 2097152, tapi panjang maks arg yang bisa saya lewati masih 131071 (dan saya tidak harus mengurangi ukuran lingkungan).
Dijeda sampai pemberitahuan lebih lanjut.
1
Juga ingat itu xargsdan bahkan find -execadalah teman Anda ketika berhadapan dengan daftar argumen raksasa.
coredump
@ Dennis: nilai yang dikembalikan oleh getconfadalah tingkat kernel saya pikir. Mungkin bash menetapkan batas bawah berdasarkan desain / konfigurasinya? Juga, pengetahuan saya tentang ini berasal dari beberapa waktu yang lalu sehingga bisa jadi hal-hal telah berubah sedikit baru-baru ini, meskipun itu bukan bidang yang saya harapkan untuk melihat banyak gerakan kecuali di kulit eksperimental baru.
David Spillett
Saya mendapatkan hasil yang sama di ksh, zsh, dash, fishdan Bash 3 seperti yang saya lakukan di Bash 4. pesan kesalahan dari fishmungkin informatif: "Ikan: Ukuran total argumen dan lingkungan daftar (130KB) melebihi batas sistem operasi berkapasitas 2.0MB . " Namun, set | wc -cadalah 306317 dan env | wc -c2507 yang tidak menjelaskan perbedaannya. Saya tidak tahu apa lagi yang dihitung.
Dijeda sampai pemberitahuan lebih lanjut.
1

Apakah maksud Anda berapa panjang variabel terpanjang? Untuk mengetahuinya, Anda dapat menggunakan "x" perl untuk membuat nama variabel yang sangat panjang:

 VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR

Pada sistem saya 131071 berfungsi:

dan variabel dicetak pada 131072 terlalu besar:

VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long
davey
sumber
2
Sebenarnya itu nilai variabel yang sangat panjang .
Dijeda sampai pemberitahuan lebih lanjut.
3
Selain itu, Anda tidak harus menggunakan perldan skrip:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
Dijeda sampai pemberitahuan lebih lanjut.
@DennisWilliamson printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/nullbekerja.
jarno
Itu karena printfshell adalah built-in, jadi bashtidak perlu melakukan proses exec()pemijahan lain. ARG_MAXhanya hal-hal dengan panjang daftar argumen dari execfungsi ( exec(), execl(), execlp(), execvp(), execvpe(), dll).
Vicente Olivert Riera