Kiedy spacje wokół znaku = są zabronione?


9

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.cnfi 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.cnfpliku, ale ogólnie dla plików konfiguracyjnych * NIX. Moją pierwszą skłonnością jest RTFM, ale tak naprawdę man mysqlnie 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.


2
Nie ma czegoś takiego jak „Pliki konfiguracyjne * NIX ogólnie”. Jeśli chcę pozwolić na spacje w moim pliku konfiguracyjnym, napiszę mój program, aby na to zezwolić. Jeśli chcę, aby mój plik konfiguracyjny używał dwukropków lub potoków zamiast znaków równości, napiszę mój program, aby ich używał. Bash nie wymaga spacji. MySQL pozwala na to.
hymie

Odpowiedzi:


3

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, nieczęś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 mysqlprzykł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 sendmaili vim).
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 ) .


Zaakceptowano, ponieważ jest to odpowiedź, która najbardziej odpowiada odpowiedzi z punktu widzenia pytania. Dzięki!
dotancohen

20

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 vs command =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.


Dzięki. Martwię się o to, jak sprawdzić istniejące pliki, teraz i w przyszłości, które mogły zostać skonfigurowane przez inne typy rozwijających się programistów. Sam konfigurując pliki, postępuję zgodnie z konwencją zawartą tam, jak sugeruje opiekun pakietu. Zredagowałem pytanie, aby wyjaśnić.
dotancohen

1
Myślę, że jeśli sprawdzasz istniejące pliki, sprawdzę dokumentację produktu i użyję tego jako przykładu. Zakładając, że masz dokumentację i nie jest to niestandardowa aplikacja. Gdyby była to aplikacja niestandardowa, trzymałbym się wszystkiego, co już tam było. „Jeśli się nie zepsuło, nie naprawiaj”
Lawrence

Niestety niektóre z nich zepsute. Właśnie dlatego pytam!
dotancohen

W pociskach nigdy nie używaj spacji wokół równych. We wszystkim, co nie jest powłoką, zawsze używaj spacji. Możesz kontrolować istniejące pliki za pomocą grep: 'grep "[^] = [^]" / etc / *', aby znaleźć pliki z =, które nie mają spacji.
qris

2
@dotancohen (1.) Dla każdego pliku konfiguracyjnego powinno być co najmniej jedno ustawienie, które raczej łatwo byłoby sprawdzić, czy jest uszkodzony. Niezależnie od tego, czy plik konfiguracyjny dopuszcza spacje, czy nie, powinien to robić konsekwentnie przez cały czas. (2.) Zawsze możesz pobrać aplikację i sprawdzić domyślne konfiguracje, z którymi jest dostarczana. (3.) Zawsze możesz całkowicie pominąć spacje. a = bmoże nie zawsze być do zaakceptowania, ale a=bzawsze powinno działać.
Two-Bit Alchemist

4

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


1
.bashrcto nie plik konfiguracyjny dla bash. .bashrcto 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.
Josh

3

Niektóre programy oferują sprawdzenie pliku konfiguracyjnego, na przykład:

postfix check

W przeciwnym razie możesz pobrać oryginalne pliki konfiguracyjne z repozytoriów i porównać je z diff z bieżącym.


W rzeczywistości wygląda na to, że naprawdę rozwiązuje podstawowy problem. Dzięki!
dotancohen

2

Spacje wokół =znaku zawsze stanowią problem, gdy wykonujesz zadanie w bash. 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, bashnie ma związku. Musisz przeczytać dokumentację, aby wiedzieć, jaka składnia jest dozwolona w pliku konfiguracyjnym.

Przykładem mysqlw skrypcie init /etc/init.d/mysqldjest parser dla 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

Istnieje wyjątek w (( var = 12 ))lub var=( value )lub $((var = 12))lub${var[foo = 12]}
Stéphane Chazelas

@ StéphaneChazelas: Nie wspomniałem o tych przypadkach w tym pytaniu, dodaj informacje. Dzięki.
cuonglm
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.