Saya meneruskan variabel ke skrip di baris perintah. Berapa batas karakter perintah? misalnya:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Terima kasih.
linux
command-line-interface
Robdog
sumber
sumber
Jawaban:
Batas yang dikenakan shell / OS umumnya sangat panjang - biasanya satu atau dua ratus ribu karakter.
getconf ARG_MAX
akan 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 inienv | 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.
sumber
getconf ARG_MAX
berikan 2097152, tapi panjang maks arg yang bisa saya lewati masih 131071 (dan saya tidak harus mengurangi ukuran lingkungan).xargs
dan bahkanfind -exec
adalah teman Anda ketika berhadapan dengan daftar argumen raksasa.getconf
adalah 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
,fish
dan Bash 3 seperti yang saya lakukan di Bash 4. pesan kesalahan darifish
mungkin informatif: "Ikan: Ukuran total argumen dan lingkungan daftar (130KB) melebihi batas sistem operasi berkapasitas 2.0MB . " Namun,set | wc -c
adalah 306317 danenv | wc -c
2507 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
sumber
Apakah maksud Anda berapa panjang variabel terpanjang? Untuk mengetahuinya, Anda dapat menggunakan "x" perl untuk membuat nama variabel yang sangat panjang:
Pada sistem saya 131071 berfungsi:
dan variabel dicetak pada 131072 terlalu besar:
sumber
perl
dan skrip:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
bekerja.printf
shell adalah built-in, jadibash
tidak perlu melakukan prosesexec()
pemijahan lain.ARG_MAX
hanya hal-hal dengan panjang daftar argumen dariexec
fungsi (exec()
,execl()
,execlp()
,execvp()
,execvpe()
, dll).