Saya tahu bahwa di ~ / .bashrc seseorang tidak boleh menaruh spasi di sekitar =
tanda - tanda dalam penugasan:
$ tail -n2 ~/.bashrc
alias a="echo 'You hit a!'"
alias b = "echo 'You hit b!'"
$ a
You hit a!
$ b
b: command not found
Saya sedang meninjau file konfigurasi MySQL /etc/my.cnf
dan saya telah menemukan ini:
tmpdir=/mnt/ramdisk
key_buffer_size = 1024M
innodb_buffer_pool_size = 512M
query_cache_size=16M
Bagaimana saya bisa memverifikasi bahwa ruang di sekitar =
tanda tidak menjadi masalah?
Perhatikan bahwa pertanyaan ini tidak khusus untuk /etc/my.cnf
file tersebut, tetapi lebih kepada * NIX file konfigurasi secara umum. Kecenderungan pertama saya adalah ke RTFM tetapi sebenarnya man mysql
tidak menyebutkan masalah ini dan jika saya perlu berburu online untuk setiap kasus, saya tidak akan pernah sampai ke mana pun. Apakah ada konvensi atau cara mudah untuk memeriksanya? Seperti dapat dilihat, banyak orang telah mengedit file ini (konvensi berbeda untuk =
tanda - tanda) dan saya tidak dapat memaksa mereka semua untuk tidak menggunakan spasi, juga saya tidak bisa gila memeriksa semua yang mungkin telah dikonfigurasi dan mungkin atau mungkin tidak benar.
EDIT: Tujuan saya adalah untuk memastikan bahwa file yang saat ini dikonfigurasi dilakukan dengan benar. Ketika mengkonfigurasi file sendiri, saya pergi dengan konvensi apa pun yang dimasukkan oleh pengelola paket di sana.
sumber
Jawaban:
Saya akan menjawabnya dengan cara yang lebih umum - melihat sedikit pada keseluruhan " pengalaman belajar Unix ".
Dalam contoh Anda, Anda menggunakan dua alat, dan melihat bahasanya mirip. Tidak jelas kapan harus menggunakan apa sebenarnya. Tentu saja Anda dapat mengharapkan ada struktur yang jelas , sehingga Anda meminta kami untuk menjelaskannya.
Kasus dengan ruang sekitar
=
hanya dan contoh - ada banyak kasus serupa-tetapi-bot-cukup .Ada harus menjadi logika di dalamnya, kan ?!
The aturan bagaimana menulis kode untuk beberapa alat , shell, basis data dll hanya tergantung pada apa alat tertentu membutuhkan .
Itu berarti bahwa alat tersebut sepenuhnya independen , secara teknis. The hubungan logis yang saya pikir Anda harapkan hanya tidak ada .
Kesamaan yang jelas dari bahasa yang Anda lihat bukan bagian dari implementasi program . Kesamaan ada karena pengembang telah setuju bagaimana melakukannya ketika mereka menuliskannya untuk program tertentu. Tetapi manusia hanya bisa menyetujui sebagian .
The hubungan Anda lihat adalah budaya hal - itu tidak bagian dari implementasi , maupun dalam definisi bahasa .
Jadi, sekarang kita telah menangani teorinya, apa yang harus dilakukan dalam praktik?
Langkah besar adalah menerima bahwa konsistensi yang Anda harapkan tidak ada - yang jauh lebih mudah ketika memahami alasannya - saya harap bagian teori membantu dalam hal ini.
Jika Anda memiliki dua alat, yang tidak menggunakan bahasa konfigurasi yang sama (mis. Keduanya skrip bash), mengetahui detail sintaksis satu tidak banyak membantu dalam memahami yang lain;
Jadi, memang, Anda harus mencari detail secara mandiri . Pastikan Anda tahu di mana Anda menemukan dokumentasi referensi untuk masing-masing.
Di sisi positif, ada beberapa konsistensi di mana Anda tidak mengharapkannya: dalam konteks alat tunggal (atau alat yang berbeda menggunakan bahasa yang sama), Anda dapat yakin sintaksinya konsisten.
Dalam
mysql
contoh Anda , itu berarti Anda dapat mengasumsikan bahwa semua baris memiliki aturan yang sama. Jadi aturan adalah "ruang sebelum dan sesudah=
adalah tidak relevan ".Ada banyak perbedaan dalam seberapa sulitnya mempelajari atau menggunakan bahasa konfigurasi atau skrip alat.
Ini bisa berupa " Daftar nilai foo di cmd-foo.conf, satu nilai per baris.".
Ini bisa menjadi bahasa scripting lengkap yang digunakan di tempat lain juga. Maka Anda memiliki alat yang ampuh untuk menulis konfigurasi - dan dalam beberapa kasus itu bagus, di lain Anda benar-benar membutuhkannya.
Alat-alat yang kompleks , atau keluarga besar dari alat-alat terkait terkadang hanya menggunakan sintaksis file konfigurasi khusus yang sangat kompleks - (beberapa contoh terkenal adalah
sendmail
danvim
).Lainnya menggunakan skrip umumbahasa sebagai basis, dan perluas bahasa itu untuk mendukung kebutuhan khusus , kadang-kadang dengan cara yang rumit, sebagaimana bahasa itu memungkinkan. Itu akan menjadi kasus yang sangat spesifik dari bahasa khusus domain ( DSL ) .
sumber
Bash akan menginterpretasikan baris yang memiliki teks diikuti oleh
=
sebagai penugasan ke variabel, tetapi itu akan menafsirkan garis yang memiliki teks diikuti oleh spasi sebagai perintah dengan argumen.var=assignment
vs.command =argument
Skrip Bash bekerja berdasarkan prinsip bahwa semua yang ada di skrip seolah-olah Anda telah mengetiknya di baris perintah.
Dalam file konfigurasi yang tidak ditafsirkan oleh
bash
(atau shell lain), itu akan ditentukan oleh pengurai yang digunakan untuk membaca file konfigurasi. Beberapa parser akan mengambil ruang, beberapa tidak. Terserah aplikasi dalam kasus itu. Secara pribadi, saya menggunakan konvensi apa pun yang digunakan oleh file konfigurasi default.sumber
a = b
mungkin tidak selalu dapat diterima tetapia=b
harus selalu berhasil..bashrc tidak lebih dari file konfigurasi untuk bash, sama seperti my.cnf, php.ini, httpd.conf atau launchd plist. Masing-masing memiliki sintaks mereka sendiri, mulai dari penugasan bash tanpa-ruang hingga sup tag XML launchd (ada juga versi biner: -O)
Tidak ada konvensi yang tegas, dan Anda telah menemukan Petunjuk Utama Unix: Baca Manual Baik .
sumber
.bashrc
adalah tidak file konfigurasi untuk bash..bashrc
adalah skrip shell yang dijalankan bash setiap kali proses bash dimulai. Itu dapat digunakan untuk mengkonfigurasi bash tetapi dapat digunakan untuk melakukan segala macam hal lain juga: itu adalah skrip, bukan file konfigurasi.Beberapa program menawarkan pemeriksaan file konfigurasi, misalnya:
Kalau tidak, Anda bisa mendapatkan file konfigurasi asli dari repositori dan membandingkannya dengan diff saat ini.
sumber
Ruang di sekitar
=
tanda selalu bermasalah ketika Anda melakukan tugasbash
. Tidak ada pengecualian di sini, Anda harus menghapus semua ruang di sekitar=
jika Anda ingin mendapatkan tugas sederhana yang valid (tidak ada ekspansi, tidak ada aritmatika, tidak ada tugas array) dibash
.Untuk file konfigurasi, karena setiap perangkat lunak memiliki parser sendiri untuk mem-parsing file konfigurasi,
bash
tidak memiliki hubungan. Anda harus membaca dokumentasi untuk mengetahui sintaks apa yang diizinkan dalam file konfigurasi.Contohnya adalah
mysql
, dalam skrip initnya/etc/init.d/mysqld
, ia memiliki parser untukmy.cnf
:sumber
(( var = 12 ))
atauvar=( value )
atau$((var = 12))
atau${var[foo = 12]}