Wiem, że w ~ / .bashrc nie można umieszczać spacji wokół =
znaków w przypisaniu:
$ tail -n2 ~/.bashrc
alias a="echo 'You hit a!'"
alias b = "echo 'You hit b!'"
$ a
You hit a!
$ b
b: command not found
Przeglądam plik konfiguracyjny MySQL /etc/my.cnf
i znalazłem to:
tmpdir=/mnt/ramdisk
key_buffer_size = 1024M
innodb_buffer_pool_size = 512M
query_cache_size=16M
Jak mogę sprawdzić, czy odstępy wokół =
znaków nie stanowią problemu?
Pamiętaj, że to pytanie nie jest specyficzne dla /etc/my.cnf
pliku, ale ogólnie dla plików konfiguracyjnych * NIX. Moją pierwszą skłonnością jest RTFM, ale tak naprawdę man mysql
nie wspomina o tym problemie, a jeśli będę musiał polować online dla każdej sprawy, nigdy się nie dostanę. Czy jest jakaś konwencja lub łatwy sposób sprawdzenia? Jak widać, wiele osób edytowało ten plik (różne konwencje =
znaków) i nie mogę zmusić ich wszystkich, aby nie używały spacji, ani nie oszalałem sprawdzając wszystkiego, co zostało skonfigurowane i może być lub nie być poprawne.
EDYCJA: Mam zamiar upewnić się, że aktualnie skonfigurowane pliki są wykonane poprawnie. Konfigurując pliki sam, korzystam z konwencji tego, co tam umieścił opiekun pakietu.
źródło
Odpowiedzi:
Odpowiem na to w bardziej ogólny sposób - patrząc trochę na całe „ doświadczenie uczenia się w Uniksie ”.
W twoim przykładzie używasz dwóch narzędzi i widzisz, że język jest podobny. Po prostu nie wiadomo, kiedy dokładnie tego użyć. Oczywiście można oczekiwać, że struktura jest przejrzysta , dlatego prosimy nas o wyjaśnienie.
Przypadek z przestrzenią wokół
=
jest tylko i przykładem - istnieje wiele podobnych, ale bot-dość przypadków.Musi być w tym logika, prawda ?!
Te zasady , jak napisać kod dla niektórych narzędzi , muszli, bazy danych itp zależy tylko od tego, co to szczególne narzędzie wymaga .
Oznacza to, że narzędzia są całkowicie niezależne technicznie. Logiczna relacja że myślę, że można się spodziewać po prostu nie istnieje .
Oczywiste podobieństwo języków, które widzisz, nie są częścią wdrożenia programu . Podobieństwo istnieje, ponieważ programiści uzgodnili, jak to zrobić, spisując go dla określonego programu. Ale ludzie mogą się zgodzić tylko częściowo .
Relacja widzisz to kulturalny rzeczą - to ani częścią realizacji , ani w definicji języka .
A więc, skoro wymyśliliśmy teorię, co robić w praktyce?
Dużym krokiem jest zaakceptowanie , że oczekiwana spójność nie istnieje - co jest znacznie łatwiejsze, gdy rozumiemy przyczyny - mam nadzieję, że część teoretyczna pomoże w tym.
Jeśli masz dwa narzędzia, które nie używają tego samego języka konfiguracji (np. Oba skrypty bash), znajomość szczegółów składni jednego z nich nie pomaga w zrozumieniu drugiego;
Rzeczywiście będziesz musiał samodzielnie wyszukać szczegóły . Upewnij się, że wiesz, gdzie znajdziesz dokumentację referencyjną dla każdego z nich.
Z drugiej strony istnieje pewna spójność, której się nie spodziewałeś: w kontekście jednego narzędzia (lub różnych narzędzi używających tego samego języka) możesz być całkiem pewien, że składnia jest spójna.
W twoim
mysql
przykładzie oznacza to, że możesz założyć, że wszystkie linie mają tę samą regułę. Zatem reguła brzmi: „spacja przed i po nie=
ma znaczenia ”.Istnieją duże różnice w tym, jak trudno jest nauczyć się lub używać języka konfiguracji lub skryptów narzędzia.
Może to być coś w stylu „Wyświetl wartości foo w cmd-foo.conf, po jednej w wierszu.”.
Może to być pełny język skryptowy, który jest również używany w innym miejscu. Masz wtedy potężne narzędzie do pisania konfiguracji - w niektórych przypadkach jest to po prostu fajne, w innych naprawdę będziesz tego potrzebować.
Złożone narzędzia lub duże rodziny powiązanych narzędzi czasami używają bardzo złożonej specjalnej składni pliku konfiguracyjnego - (niektóre znane przykłady to
sendmail
ivim
).Inni używają ogólnego skryptujęzyk jako podstawa, i rozszerz ten język, aby zaspokoić specjalne potrzeby , czasami w skomplikowany sposób, w zależności od języka. Byłby to bardzo konkretny przypadek języka specyficznego dla domeny ( DSL ) .
źródło
Bash zinterpretuje wiersz z tekstem, po którym następuje
=
przypisanie do zmiennej, ale zinterpretuje wiersz z tekstem i spacją jako polecenie z argumentem.var=assignment
vscommand =argument
Skrypty Bash działają na zasadzie, że wszystko w skrypcie jest tak, jakbyś wpisał go w linii poleceń.
W plikach konfiguracyjnych, które nie są interpretowane przez
bash
(lub inną powłokę), zostanie to określone przez analizator składni używany do odczytu pliku konfiguracyjnego. Niektóre parsery zajmą miejsca, inne nie. W takim przypadku zależy to od aplikacji. Osobiście używam dowolnej konwencji, z której korzystał domyślny plik konfiguracyjny.źródło
a = b
może nie zawsze być do zaakceptowania, alea=b
zawsze powinno działać..bashrc jest niczym więcej niż plikiem konfiguracyjnym dla bash, podobnie jak my.cnf, php.ini, httpd.conf lub uruchomiona lista. Każda z nich ma własną składnię, od przypisania bash do braku miejsca do zupy tagów XML uruchomionej (istnieje również wersja binarna: -O)
Brak firmową konwencje, a już odkrył Prime dyrektywę Unix: Czytaj dzieła ręcznego.
źródło
.bashrc
to nie plik konfiguracyjny dla bash..bashrc
to skrypt powłoki, który bash jest uruchamiany za każdym razem, gdy rozpoczyna się proces bash. Można go użyć do skonfigurowania basha, ale można go również użyć do wielu innych rzeczy: jest to skrypt, a nie plik konfiguracyjny.Niektóre programy oferują sprawdzenie pliku konfiguracyjnego, na przykład:
W przeciwnym razie możesz pobrać oryginalne pliki konfiguracyjne z repozytoriów i porównać je z diff z bieżącym.
źródło
Spacje wokół
=
znaku zawsze stanowią problem, gdy wykonujesz zadanie wbash
. Nie ma tu wyjątku, musisz usunąć wszystkie spacje,=
jeśli chcesz uzyskać prawidłowe proste przypisanie (bez rozwinięcia, bez arytmetyki, bez przypisania tablicy)bash
.W przypadku pliku konfiguracyjnego, ponieważ każde oprogramowanie ma własny parser do analizowania pliku konfiguracyjnego,
bash
nie ma związku. Musisz przeczytać dokumentację, aby wiedzieć, jaka składnia jest dozwolona w pliku konfiguracyjnym.Przykładem
mysql
w skrypcie init/etc/init.d/mysqld
jest parser dlamy.cnf
:źródło
(( var = 12 ))
lubvar=( value )
lub$((var = 12))
lub${var[foo = 12]}