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_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 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_MAX
berikan 2097152, tapi panjang maks arg yang bisa saya lewati masih 131071 (dan saya tidak harus mengurangi ukuran lingkungan).
xargs
dan bahkan find -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 dari fish
mungkin informatif: "Ikan: Ukuran total argumen dan lingkungan daftar (130KB) melebihi batas sistem operasi berkapasitas 2.0MB . " Namun, set | wc -c
adalah 306317 dan env | 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
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
perl
dan skrip:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
bekerja.
printf
shell adalah built-in, jadi bash
tidak perlu melakukan proses exec()
pemijahan lain. ARG_MAX
hanya hal-hal dengan panjang daftar argumen dari exec
fungsi ( exec()
, execl()
, execlp()
, execvp()
, execvpe()
, dll).