Saya meneruskan variabel ke skrip di baris perintah. Berapa batas karakter perintah? misalnya:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Terima kasih.
Saya meneruskan variabel ke skrip di baris perintah. Berapa batas karakter perintah? misalnya:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Terima kasih.
Jawaban:
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.
getconf ARG_MAXberikan 2097152, tapi panjang maks arg yang bisa saya lewati masih 131071 (dan saya tidak harus mengurangi ukuran lingkungan).
xargsdan bahkan find -execadalah teman Anda ketika berhadapan dengan daftar argumen raksasa.
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.
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.
ARG_MAX memang membatasi ukuran total dari baris perintah dan lingkungan, tetapi Anda menghadapi batasan tambahan: satu argumen tidak boleh lebih dari MAX_ARG_STRLEN (yang sayangnya dikodekan menjadi 131072).
Lihat /unix/120642/what-defines-the-maximum-size-for-a-command-single-argument
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
perldan skrip:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/nullbekerja.
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).