= İşaretinin etrafındaki boşluklar ne zaman yasaklanmıştır?


9

~ / .Bashrc'de görevdeki işaretlerin etrafına boşluk bırakmaması gerektiğini biliyorum=

$ tail -n2 ~/.bashrc 
alias a="echo 'You hit a!'"
alias b = "echo 'You hit b!'"

$ a
You hit a!

$ b
b: command not found

MySQL yapılandırma dosyasını inceliyorum /etc/my.cnfve bunu buldum:

tmpdir=/mnt/ramdisk
key_buffer_size = 1024M
innodb_buffer_pool_size = 512M
query_cache_size=16M

=İşaretlerin etrafındaki boşlukların sorun olmadığını nasıl doğrulayabilirim ?

Bu sorunun /etc/my.cnfdosyaya özgü olmadığını, genel olarak * NIX yapılandırma dosyalarına özgü olduğunu unutmayın . İlk eğilimim RTFM'ye ama aslında man mysqlsorundan bahsetmiyor. Herhangi bir sözleşme veya kontrol etmenin kolay bir yolu var mı? Görülebileceği gibi, birden fazla kişi bu dosyayı ( =işaretler için farklı kurallar ) düzenledi ve ben de onları boşluk kullanmamaya zorlayamıyorum ya da yapılandırılmış olan ve doğru olan ya da doğru olmayan her şeyi kontrol edip deliremiyorum.

DÜZENLEME: Niyetim şu anda yapılandırılmış dosyaların düzgün şekilde yapılmasını sağlamak. Dosyaları kendim yapılandırırken, paket koruyucunun buraya koyduğu her şeye uyuyorum.


2
"* Genel olarak NIX yapılandırma dosyaları" diye bir şey yoktur. Yapılandırma dosyamdaki boşluklara izin vermek istersem, izin vermek için programımı yazacağım. Yapılandırma dosyamın eşit işaretler yerine iki nokta üst üste veya boru kullanmasını istiyorsam, bunları kullanmak için programımı yazacağım. Bash boşluk gerektirmez. MySQL onlara izin verir.
Hymie

Yanıtlar:


3

Bunu daha genel bir şekilde cevaplayacağım - bütün "Unix öğrenme deneyimine " biraz bakacağım .

Örneğinizde iki araç kullanıyorsunuz ve dilin benzer olduğunu görüyorsunuz. Tam olarak ne zaman kullanılacağı belli değil. Tabii ki net bir yapı olmasını bekleyebilirsiniz , bu yüzden bunu açıklamamızı istersiniz. Çevresindeki alan sadece ve örnektir - benzer ama bot-bot vakalarının birçoğu vardır . İçinde bir mantık olmalı , değil mi ?!
=

Kurallar nasıl bazıları için kod yazmak aracı vb kabuk, veritabanı sadece bağlı bu özel aracı ne gerektirir .

Bu, araçların teknik olarak tamamen bağımsız olduğu anlamına gelir . Mantıksal ilişki Ben sadece bekliyoruz düşünüyorum yok .

Gördüğünüz dillerin bariz benzerliği program uygulamasının bir parçası değildir . Benzerlik var çünkü geliştiriciler belirli bir program için yazdıklarında bunu nasıl yapacaklarını kabul etmişlerdi. Ancak insanlar sadece kısmen katılabilirler .

İlişki Gördüğünüz bir olan kültür şey - bu ne bir parçası uygulanması , ne de dilin tanımı .



Şimdi, teoriyi ele aldığımıza göre, pratikte ne yapmalı?

Büyük bir adım olduğunu kabul olduğunu tutarlılık beklediğiniz yok çok daha kolay olan anlayış ne zaman - nedenleri - Ben teori kısmı bu yardımcı olur umarım.

Aynı yapılandırma dilini kullanmayan (örneğin her iki bash komut dosyası) iki aracınız varsa, birinin sözdiziminin ayrıntılarını bilmek diğerinin anlaşılmasına pek yardımcı olmaz;
Yani, ayrıntıları bağımsız olarak aramak zorunda kalacaksınız . Her biri için referans belgelerini nerede bulduğunuzu bildiğinizden emin olun .

Olumlu tarafta, beklemediğiniz bazı tutarlılıklar vardır: tek bir araç bağlamında (veya aynı dili kullanan farklı araçlar), sözdiziminin tutarlı olduğundan oldukça emin olabilirsiniz.
Senin içinde mysqlörneğin, anlama geldiğini tüm hatlar aynı kural vardır varsayabiliriz. Dolayısıyla kural "önceki ve sonraki boşluk =önemli değil " dir.

Bir aracın yapılandırma veya komut dosyası dilini öğrenmenin veya kullanmanın ne kadar zor olduğu konusunda büyük farklılıklar vardır . Bazıları, " foo değerlerini cmd-foo.conf biçiminde, her satıra bir tane olarak listele " gibi olabilir . Başka bir yerde de kullanılan tam bir betik dili olabilir. Sonra yapılandırma yazmak için güçlü bir aracınız var - ve bazı durumlarda bu sadece hoş, diğerlerinde gerçekten buna ihtiyacınız olacak. Karmaşık araçlar veya ilgili araçların büyük famillileri bazen sadece çok karmaşık özel yapılandırma dosyası sözdizimi kullanır - (bazı ünlü örnekler ve ). Diğerleri genel bir komut dosyası kullanır


sendmailvim
dilini temel alır ve dilin izin verdiği ölçüde, özel gereksinimleri , karmaşık zamanlarda , özel ihtiyaçları desteklemek için bu dili genişletir . Bu, etki alanına özgü bir dilin ( DSL ) çok özel bir durumu olacaktır .


Bu sorunun cevabı, sorunun bakış açısından cevabın çoğunu ele alan cevaptır. Teşekkürler!
dotancohen

20

Bash, metinden sonra gelen bir satırı =bir değişkene atama olarak yorumlar, ancak metni içeren bir satırı ve ardından boşluk içeren bir satırı argümanlı bir komut olarak yorumlar.

var=assignment vs command =argument

Bash komut dosyaları, komut dosyasındaki her şeyin komut satırına yazmışsınız gibi olması ilkesi üzerinde çalışır.

bash(Veya başka bir kabuk) tarafından yorumlanmayan yapılandırma dosyalarında , yapılandırma dosyasını okumak için kullanılan ayrıştırıcı tarafından belirlenir. Bazı ayrıştırıcılar boşluk alacak, bazıları ayrılmayacak. Bu durumda uygulamaya bağlı. Şahsen, varsayılan yapılandırma dosyasının kullandığı kurallara uyuyorum.


Teşekkürler. Ben şimdi ve gelecekte, diğer tomurcuklanan devops türleri tarafından yapılandırılmış olabilir, varolan dosyaları kontrol etme konusunda endişeliyim. Dosyaları kendim yapılandırırken, önerdiğiniz gibi, paket koruyucunun buraya koyduğu her şeye uyuyorum. Soruyu açıklığa kavuşturmak için düzenledim.
dotancohen

1
Mevcut dosyaları kontrol ediyorsanız, ürünün belgelerini kontrol edip örnek olarak kullanacağımı tahmin ediyorum. Belgeleriniz olduğunu ve özel olarak oluşturulmuş bir uygulama olmadığını varsayarsak. Özel bir uygulama olsaydı, zaten orada olan her şeye bağlı kalırdım. "Eğer kırılmazsa, tamir etmeyin"
Lawrence

Ne yazık ki, bazıları şunlardır kırdı. Bu yüzden soruyorum!
dotancohen

Kabuklarda, asla eşit bir alanda boşluk kullanmayın. Kabuk olmayan herhangi bir şeyde daima boşluk kullanın. Boşluğu olmayan = içeren dosyaları bulmak için grep: 'grep "[^] = [^]" / etc / *' kullanarak mevcut dosyaları denetleyebilirsiniz.
qris

2
@dotancohen (1.) Herhangi bir yapılandırma dosyası için, bozuk olup olmadığını kontrol etmenin oldukça kolay olacağı en az bir ayar olmalıdır. Bir yapılandırma dosyası boşluklara izin verip vermiyorsa, bunu tutarlı bir şekilde yapmalıdır. (2.) Her zaman bir uygulama indirebilir ve birlikte verilen varsayılan yapılandırmaları kontrol edebilirsiniz. (3.) Her zaman boşluk bırakabilirsiniz. a = bher zaman kabul edilebilir olmayabilir, ancak a=bher zaman çalışmalıdır.
İki Bit Simyacı

4

.bashrc, bash için bir yapılandırma dosyasından başka bir şey değildir, tıpkı my.cnf, php.ini, httpd.conf veya bir launchd plist gibi. Her birinin bash'ın boşluk bırakmadan atamasının XML etiketi çorbasına kadar kendi sözdizimi vardır (ayrıca bir ikili sürüm de vardır: -O)

Hiçbir kesin kural yoktur ve Unix'in Prime Direktifini zaten keşfettiniz: Fine Manual'ı okuyun .


1
.bashrcolduğu değil bash için bir yapılandırma dosyası. her bash işlemi başladığında bash'ın çalıştığı .bashrcbir kabuk betiğidir . Bash'ı yapılandırmak için kullanılabilir, ancak diğer her şeyi yapmak için de kullanılabilir: bir komut dosyası değil, bir komut dosyasıdır.
Josh

3

Bazı programlar yapılandırma dosyasının bir kontrolünü sunar, örneğin:

postfix check

Aksi takdirde, orijinal yapılandırma dosyalarını depolardan alabilir ve bunları farklı akımlarla karşılaştırabilirsiniz.


Aslında, bu temel sorunu gerçekten ele alıyor gibi görünüyor. Teşekkürler!
dotancohen

2

=Bir atama yaptığınızda işaretin etrafındaki boşluklar her zaman sorun olur bash. Burada bir istisna yoktur, içinde =geçerli bir basit atama (genişletme yok, aritmetik yok, dizi ataması yok) almak istiyorsanız etrafındaki tüm boşlukları kaldırmanız gerekir bash.

Yapılandırma dosyası için, her yazılımın yapılandırma dosyasını ayrıştırmak için kendi ayrıştırıcısı olduğu için bashhiçbir ilişkisi yoktur. Yapılandırma dosyasında hangi sözdizimine izin verildiğini öğrenmek için belgeleri okumalısınız.

Bir örnek, mysqlinit komut dosyasında aşağıdakiler /etc/init.d/mysqldiçin ayrıştırıcıya sahip olmasıdır 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

(( var = 12 ))Veya var=( value )veya $((var = 12))veya bir istisna var${var[foo = 12]}
Stéphane Chazelas

@ StéphaneChazelas: Bu sorudaki olaylarla ilgili değil, bilgi ekleyin. Teşekkürler.
cuonglm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.