Коли пробіли навколо знака = заборонені?


9

Я знаю , що в ~ / .bashrc одне сусло НЕ ставити прогалини навколо =знаків присвоювання:

$ 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 /etc/my.cnfі виявив таке:

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

Як я можу переконатися, що пробіли навколо =знаків не є проблемою?

Зауважте, що це питання не стосується /etc/my.cnfфайлу, а загалом * NIX-конфігураційних файлів. Моє перше схильність - це RTFM, але насправді man mysqlце не згадує, і якщо мені потрібно піти на полювання в Інтернеті для кожного випадку, я нікуди не потрапляю. Чи є конвенція чи простий спосіб перевірити? Як видно, кілька людей редагували цей файл (різні умовні =позначення), і я не можу їх усіх змусити використовувати жодних пробілів, а також не можу зійти з розуму, перевіряючи все, що було налаштовано, а може бути, а може і не правильно.

РЕДАКТУВАННЯ: Я маю на меті забезпечити належне налаштування файлів належним чином. Налаштовуючи файли самостійно, я дотримуюсь домовленостей про те, що там розміщував сервісний пакет.


2
Немає такого поняття, як "* конфігураційні файли NIX взагалі". Якщо я хочу дозволити пробіли у своєму конфігураційному файлі, я напишу свою програму, щоб дозволити їх. Якщо я хочу, щоб у моєму конфігураційному файлі замість рівних знаків використовувались колонки або труби, тоді я напишу свою програму для їх використання. Bash не потребує пробілів. Mysql дозволяє їх.
hymie

Відповіді:


3

Я відповім на це в більш загальному вигляді - трохи переглянувши весь " досвід навчання Unix ".

У вашому прикладі ви використовуєте два інструменти, і див. Мова схожа. Просто незрозуміло, коли саме використовувати, що саме. Звичайно, ви можете очікувати, що існує чітка структура , тому ви просите, щоб ми це пояснили.
Справа з простором навколо =є лише прикладом - є безліч подібних, але бот-цілком випадків.
У цьому має бути логіка, правда ?!

У правила , як писати код для деякого інструменту , оболонки, бази даних і т.д. тільки залежить від того, що саме цей інструмент вимагає .

Це означає, що інструменти технічно абсолютно незалежні . Логічне відношення , що я думаю , що ви очікуєте , просто не існує .

Очевидна схожість мов, які ви бачите, не є частиною реалізації програми . Подібність існує тому, що розробники домовилися, як це зробити, коли записали її для певної програми. Але люди можуть погодитися лише частково .

Ставлення ви бачите , це культурна річ - це ні частина реалізації , ні в визначенні мови .



Отже, тепер, коли ми розглядали теорію, що робити на практиці?

Великий крок - визнати, що очікуваної вами послідовності не існує - що набагато простіше при розумінні причин - я сподіваюся, що теоретична частина допомагає в цьому.

Якщо у вас є два інструменти, які не використовують однакову мову конфігурації (наприклад, обидва сценарії bash), знання деталей синтаксису одного не дуже допомагає зрозуміти інший;
Тож справді вам доведеться шукати деталі самостійно . Переконайтеся, що ви знаєте, де ви знайдете довідкову документацію для кожного.

З позитивної сторони, є певна послідовність, де ви цього не очікували: в контексті одного інструменту (або різних інструментів, що використовують одну і ту ж мову), ви можете бути впевнені в синтаксисі.
У вашому mysqlприкладі це означає, що ви можете припустити, що всі рядки мають одне правило. Таким чином, правило «простір до і після того, як =це НЕ має значення ».

Існує велика різниця в тому, як важко вивчити або використовувати мову конфігурації чи сценаріїв інструменту.
Це може бути щось на зразок " Перерахуйте значення foo у cmd-foo.conf, по одному на рядок."
Це може бути повна мова сценаріїв, яка використовується і в інших місцях. Тоді у вас є потужний інструмент для написання конфігурації - а в деяких випадках це просто приємно, в інших вам це справді знадобиться.
Складні інструменти або великі родинні споріднені інструменти іноді просто використовують дуже складний синтаксис спеціального файлу конфігурації - (деякі відомі приклади є sendmailі vim).
Інші використовують загальний сценаріймови як основи, і розширити цю мову для підтримки особливих потреб , іноді складними способами, як це дозволяє мова. Це був би дуже специфічний випадок мови, що залежить від домену ( DSL ) .


Прийнято як таку відповідь, яка найбільше адресує відповідь з точки зору питання. Дякую!
dotancohen

20

Bash буде інтерпретувати рядок, у якому текст, за яким слідує a, =як присвоєння змінній, але він буде інтерпретувати рядок, у якому текст, а потім пробіл, як команда з аргументом.

var=assignment проти command =argument

Сценарії Bash працюють за тим принципом, що все в скрипті так, ніби ви ввели його в командний рядок.

У файлах конфігурації, які не інтерпретуються bash(або іншою оболонкою), він визначатиметься парсером, який використовується для зчитування файлу конфігурації. Деякі аналізатори займуть пробіли, інші - не. Це залежить від заявки в такому випадку. Особисто я працюю з будь-якою умовою, який використовував файл конфігурації за замовчуванням.


Дякую. Мене хвилює питання про те, як перевірити існуючі файли зараз і в майбутньому, які, можливо, були налаштовані іншими типами початківців девепсів. Налаштовуючи файли самостійно, я погоджуюсь з умовами того, що там вводить сервісний пакет, як ви пропонуєте. Я відредагував питання, щоб уточнити.
dotancohen

1
Я думаю, якщо під час перевірки наявних файлів я перевірив би документацію продукту і використаю це як приклад. Припустимо, що у вас є документація, і це не спеціальний додаток. Якби це була спеціальна програма, я б дотримувався того, що вже було. "Якщо він не зламався, не виправляйте його"
Лоуренс

На жаль, деякі з них є мілини. Ось чому я прошу!
dotancohen

У оболонках ніколи не використовуйте пробіли навколо рівних. У всьому, що не оболонка, завжди використовуйте пробіли. Ви можете перевірити існуючі файли за допомогою grep: 'grep "[^] = [^]" / etc / *', щоб знайти файли з проміжком =, у якому немає пробілів.
qris

2
@dotancohen (1.) Для будь-якого конфігураційного файлу повинно бути принаймні одне налаштування, яке було б досить легко перевірити, чи він порушений. Чи дозволяє файл конфігурації пробіли чи ні, він повинен робити це послідовно протягом усього часу. (2.) Ви завжди можете завантажити додаток і перевірити конфігурації за замовчуванням, з якими постачається. (3.) Ви завжди можете взагалі залишати пробіли. a = bможе не завжди бути прийнятним, але a=bзавжди повинен працювати.
Двобітовий алхімік

4

.bashrc - це не що інше, як конфігураційний файл для bash, як my.cnf, php.ini, httpd.conf або запущений пліст. У кожного є свій синтаксис, починаючи від призначення пробілу bash до супу тегів XML тегів запуску (також є двійкова версія: -O)

Немає твердих конвенцій, і ви вже відкрили основну директиву Unix: Прочитайте Посібник про прекрасні дії .


1
.bashrcце НЕ конфігураційний файл для Баша. .bashrcце скрипт оболонки, який bash запускається кожного разу, коли починається процес bash. З його допомогою можна налаштувати bash, але він також може бути використаний і для будь-якого іншого: це сценарій, а не конфігураційний файл.
Джош

3

Деякі програми пропонують перевірку файлу конфігурації, наприклад:

postfix check

В іншому випадку ви можете отримати оригінальні конфігураційні файли із сховищ та порівняти їх із відмінними від поточних.


Насправді це виглядає так, що це насправді вирішує основну проблему. Дякую!
dotancohen

2

Пробіли навколо =знака - це завжди проблема, коли ви виконуєте завдання bash. Тут не є винятком, ви повинні видалити всі пробіли навколо, =якщо хочете отримати дійсне просте завдання (без розширення, без арифметики, без призначення масиву) в bash.

Для конфігураційного файлу, оскільки кожне програмне забезпечення має власний парсер для розбору свого конфігураційного файлу, bashне має жодного зв'язку. Ви повинні прочитати документацію, щоб знати, який синтаксис дозволений у конфігураційному файлі.

Прикладом є те mysql, що в його сценарії init /etc/init.d/mysqldє аналізатор для 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 ))або var=( value )або $((var = 12))або${var[foo = 12]}
Стефан Шазелас

@ StéphaneChazelas: Чи не про ці випадки у цьому питанні додайте інформацію. Дякую.
cuonglm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.