Kapan spasi di sekitar tanda = dilarang?


9

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.cnfdan 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.cnffile tersebut, tetapi lebih kepada * NIX file konfigurasi secara umum. Kecenderungan pertama saya adalah ke RTFM tetapi sebenarnya man mysqltidak 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.


2
Tidak ada yang namanya "* file konfigurasi NIX secara umum". Jika saya ingin memberikan spasi pada file konfigurasi saya, saya akan menulis program saya untuk memperbolehkannya. Jika saya ingin file konfigurasi saya menggunakan titik dua atau pipa bukan tanda sama dengan, maka saya akan menulis program saya untuk menggunakannya. Bash tidak membutuhkan ruang. Mysql memungkinkan mereka.
nyanyian pujian

Jawaban:


3

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 mysqlcontoh 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 sendmaildan vim).
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 ) .


Diterima karena ini adalah jawaban yang sebagian besar menjawab jawaban dari sudut pandang pertanyaan. Terima kasih!
dotancohen

20

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.


Terima kasih. Saya khawatir tentang cara memeriksa file yang masih ada, sekarang dan di masa depan, yang mungkin telah dikonfigurasi oleh jenis devops pemula lainnya. Ketika mengkonfigurasi file sendiri, saya pergi dengan konvensi apa pun yang dimasukkan oleh pengelola paket di sana, seperti yang Anda sarankan. Saya telah mengedit pertanyaan untuk diklarifikasi.
dotancohen

1
Saya kira jika Anda memeriksa file yang ada, saya akan memeriksa dokumentasi produk dan menggunakannya sebagai contoh. Dengan asumsi Anda memiliki dokumentasi dan itu bukan aplikasi yang dibuat khusus. Jika itu adalah aplikasi khusus, saya akan tetap dengan apa pun yang sudah ada di sana. "Jika tidak rusak, jangan memperbaikinya"
Lawrence

Sayangnya, beberapa dari mereka yang bangkrut. Itu sebabnya saya bertanya!
dotancohen

Dalam shell, jangan pernah menggunakan spasi di sekitar yang sama. Dalam hal apa pun yang bukan shell, selalu gunakan spasi. Anda dapat mengaudit file yang ada menggunakan grep: 'grep "[^] = [^]" / etc / *' untuk menemukan file dengan = yang tidak memiliki spasi.
qris

2
@dotancohen (1.) Untuk file konfigurasi apa pun, harus ada setidaknya satu pengaturan yang akan lebih mudah diperiksa jika rusak. Apakah file config memungkinkan spasi atau tidak, itu harus dilakukan secara konsisten. (2.) Anda selalu dapat mengunduh aplikasi dan memeriksa konfigurasi default yang dikirimkannya. (3.) Anda selalu dapat meninggalkan ruang sama sekali. a = bmungkin tidak selalu dapat diterima tetapi a=bharus selalu berhasil.
Alchemist Dua-Bit

4

.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 .


1
.bashrcadalah tidak file konfigurasi untuk bash. .bashrcadalah 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.
Josh

3

Beberapa program menawarkan pemeriksaan file konfigurasi, misalnya:

postfix check

Kalau tidak, Anda bisa mendapatkan file konfigurasi asli dari repositori dan membandingkannya dengan diff saat ini.


Sebenarnya, ini sepertinya benar-benar mengatasi masalah inti. Terima kasih!
dotancohen

2

Ruang di sekitar =tanda selalu bermasalah ketika Anda melakukan tugas bash. 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) di bash.

Untuk file konfigurasi, karena setiap perangkat lunak memiliki parser sendiri untuk mem-parsing file konfigurasi, bashtidak 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 untuk my.cnf:

# Try to find basedir in /etc/my.cnf
  conf=/etc/my.cnf
  print_defaults=
  if test -r $conf
  then
    subpat='^[^=]*basedir[^=]*=\(.*\)$'
    dirs=`sed -e "/$subpat/!d" -e 's//\1/' $conf`
    for d in $dirs
    do
      d=`echo $d | sed -e 's/[  ]//g'`
      if test -x "$d/bin/my_print_defaults"
      then
        print_defaults="$d/bin/my_print_defaults"
        break
      fi
      if test -x "$d/bin/mysql_print_defaults"
      then
        print_defaults="$d/bin/mysql_print_defaults"
        break
      fi
    done
  fi

Ada pengecualian dalam (( var = 12 ))atau var=( value )atau $((var = 12))atau${var[foo = 12]}
Stéphane Chazelas

@ StéphaneChazelas: Tidak tentang kasus-kasus dalam pertanyaan ini, tambahkan informasi. Terima kasih.
cuonglm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.