Wann sind Leerzeichen um das = -Zeichen verboten?

9

Ich weiß, dass man in ~ / .bashrc keine Leerzeichen um =Zeichen in der Zuordnung setzen darf :

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

$ a
You hit a!

$ b
b: command not found

Ich überprüfe die MySQL-Konfigurationsdatei /etc/my.cnfund habe Folgendes gefunden:

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

Wie kann ich überprüfen, ob die Leerzeichen um die =Schilder kein Problem darstellen?

Beachten Sie, dass diese Frage nicht spezifisch für die /etc/my.cnfDatei ist, sondern für * NIX-Konfigurationsdateien im Allgemeinen. Meine erste Neigung ist RTFM, aber man mysqlich erwähne das Problem tatsächlich nicht und wenn ich für jeden Fall online auf die Jagd gehen muss, werde ich nie irgendwohin gelangen. Gibt es eine Konvention oder eine einfache Möglichkeit, dies zu überprüfen? Wie zu sehen ist, haben mehrere Personen diese Datei bearbeitet (unterschiedliche Konventionen für =Zeichen), und ich kann sie weder dazu zwingen, keine Leerzeichen zu verwenden, noch kann ich verrückt werden, wenn ich alles überprüfe, was konfiguriert wurde und möglicherweise korrekt ist oder nicht.

BEARBEITEN: Ich möchte sicherstellen, dass die aktuell konfigurierten Dateien ordnungsgemäß ausgeführt werden. Wenn ich Dateien selbst konfiguriere, befolge ich die Konvention dessen, was der Paketbetreuer dort eingegeben hat.

dotancohen
quelle
2
Es gibt keine "* NIX-Konfigurationsdateien im Allgemeinen". Wenn ich Leerzeichen in meiner Konfigurationsdatei zulassen möchte, schreibe ich mein Programm, um sie zuzulassen. Wenn ich möchte, dass meine Konfigurationsdatei Doppelpunkte oder Pipes anstelle von Gleichheitszeichen verwendet, schreibe ich mein Programm, um sie zu verwenden. Bash benötigt keine Leerzeichen. MySQL erlaubt es ihnen.
Hymie

Antworten:

3

Ich werde das allgemeiner beantworten - ein wenig auf die gesamte "Unix- Lernerfahrung " schauen .

In Ihrem Beispiel verwenden Sie zwei Tools und sehen, dass die Sprache ähnlich ist. Es ist nur unklar, wann was genau zu verwenden ist. Natürlich können Sie davon ausgehen, dass es eine klare Struktur gibt , also bitten Sie uns, dies zu erklären.
Der Fall mit dem Raum um =ist nur ein Beispiel - es gibt viele ähnliche, aber bot-ruhige Fälle.
Es muss eine Logik geben, oder?!

Die Regeln , wie Code für einige schreiben Werkzeug , Shell, Datenbank usw. nur abhängen auf , was dieses besondere Werkzeug erfordert .

Das bedeutet, dass die Werkzeuge technisch völlig unabhängig sind. Die logische Beziehung , die Sie meiner Meinung nach erwarten, existiert einfach nicht .

Die offensichtliche Ähnlichkeit der Sprachen, die Sie sehen, ist nicht Teil der Programmimplementierung . Die Ähnlichkeit besteht darin, dass die Entwickler vereinbart hatten, wie dies zu tun ist, als sie es für ein bestimmtes Programm aufschrieben. Aber Menschen können nur teilweise zustimmen .

Die Beziehung, die Sie sehen, ist eine kulturelle Sache - sie ist weder Teil der Implementierung noch der Definition der Sprache .



Was tun in der Praxis, nachdem wir die Theorie behandelt haben?

Ein großer Schritt besteht darin, zu akzeptieren, dass die von Ihnen erwartete Konsistenz nicht vorhanden ist - was beim Verständnis der Gründe viel einfacher ist -. Ich hoffe, der theoretische Teil hilft dabei.

Wenn Sie zwei Tools haben, die nicht dieselbe Konfigurationssprache verwenden (z. B. beide Bash-Skripte), hilft es nicht viel, die Details der Syntax des einen zu kennen, um das andere zu verstehen.
Sie müssen also in der Tat unabhängig nach Details suchen . Stellen Sie sicher, dass Sie wissen, wo Sie die Referenzdokumentation für jede finden.

Positiv zu vermerken ist, dass es eine gewisse Konsistenz gibt, die Sie nicht erwartet haben: Im Kontext eines einzelnen Tools (oder verschiedener Tools, die dieselbe Sprache verwenden) können Sie ziemlich sicher sein, dass die Syntax konsistent ist.
In Ihrem mysqlBeispiel bedeutet dies, dass Sie davon ausgehen können, dass alle Zeilen dieselbe Regel haben. Die Regel lautet also "Leerzeichen vor und nach =ist nicht relevant ".

Es gibt große Unterschiede, wie schwierig es ist, die Konfigurations- oder Skriptsprache eines Tools zu lernen oder zu verwenden.
Es kann sich um " List foo values in cmd-foo.conf, einen pro Zeile" handeln.
Es kann eine vollständige Skriptsprache sein , die auch an anderer Stelle verwendet wird. Dann haben Sie ein leistungsstarkes Tool zum Schreiben von Konfigurationen - und in einigen Fällen ist das einfach nur nett, in anderen werden Sie das wirklich brauchen.
Komplexe Tools oder große Familien verwandter Tools verwenden manchmal nur eine sehr komplexe Syntax für spezielle Konfigurationsdateien - (einige berühmte Beispiele sind sendmailund vim).
Andere verwenden ein allgemeines SkriptSprache als Basis, und erweitern Sie diese Sprache, um die besonderen Bedürfnisse zu unterstützen , manchmal auf komplexe Weise, wie es die Sprache erlaubt. Dies wäre ein sehr spezifischer Fall einer domänenspezifischen Sprache ( DSL ) .

Volker Siegel
quelle
Akzeptiert, da dies die Antwort ist, die die Antwort aus der Sicht der Frage am meisten anspricht. Vielen Dank!
Dotancohen
20

Bash interpretiert eine Zeile mit Text gefolgt von a =als Zuweisung zu einer Variablen, aber eine Zeile mit Text gefolgt von einem Leerzeichen als Befehl mit einem Argument.

var=assignment vs. command =argument

Bash-Skripte funktionieren nach dem Prinzip, dass alles im Skript so ist, als hätten Sie es in die Befehlszeile eingegeben.

In Konfigurationsdateien, die nicht von bash(oder einer anderen Shell) interpretiert werden , wird dies vom Parser bestimmt, der zum Lesen der Konfigurationsdatei verwendet wird. Einige Parser nehmen Leerzeichen ein, andere nicht. In diesem Fall liegt es an der Anwendung. Persönlich gehe ich mit jeder Konvention vor, die die Standardkonfigurationsdatei verwendet hat.

Lawrence
quelle
Vielen Dank. Ich mache mir Sorgen darüber, wie ich die vorhandenen Dateien jetzt und in Zukunft überprüfen kann, die möglicherweise von anderen angehenden Entwicklertypen konfiguriert wurden. Wenn ich Dateien selbst konfiguriere, halte ich mich an die Konvention des Paketverwalters, wie Sie vorschlagen. Ich habe die Frage bearbeitet, um sie zu klären.
Dotancohen
1
Ich denke, wenn Sie vorhandene Dateien überprüfen, würde ich die Dokumentation des Produkts überprüfen und dies als Beispiel verwenden. Angenommen, Sie haben Dokumentation und es handelt sich nicht um eine benutzerdefinierte Anwendung. Wenn es eine benutzerdefinierte Anwendung wäre, würde ich mich an alles halten, was bereits vorhanden war. "Wenn es nicht kaputt ist, reparieren Sie es nicht"
Lawrence
Leider sind einige von ihnen sind pleite. Deshalb frage ich!
Dotancohen
Verwenden Sie in Muscheln niemals Leerzeichen um ein Gleiches. Verwenden Sie in allem, was keine Shell ist, immer Leerzeichen. Sie können vorhandene Dateien mit grep: 'grep "[^] = [^]" / etc / *' prüfen, um Dateien mit einem = ohne Leerzeichen zu finden.
Qris
2
@dotancohen (1.) Für jede Konfigurationsdatei sollte mindestens eine Einstellung vorhanden sein, mit der leicht überprüft werden kann, ob sie fehlerhaft ist. Unabhängig davon, ob eine Konfigurationsdatei Leerzeichen zulässt oder nicht, sollte dies durchgehend konsistent erfolgen. (2.) Sie können jederzeit eine Anwendung herunterladen und die Standardkonfigurationen überprüfen, mit denen sie geliefert wird. (3.) Sie können Leerzeichen jederzeit ganz weglassen. a = bist möglicherweise nicht immer akzeptabel, a=bsollte aber immer funktionieren.
Zwei-Bit-Alchemist
4

.bashrc ist nichts anderes als eine Konfigurationsdatei für bash, genau wie my.cnf, php.ini, httpd.conf oder eine launchd-Liste. Jedes hat seine eigene Syntax, die von der No-Space-Zuweisung von Bash bis zur XML-Tag-Suppe von launchd reicht (es gibt auch eine Binärversion: -O).

Es gibt keine festen Konventionen, und Sie haben bereits die Prime-Direktive von Unix entdeckt: Lesen Sie das Fine Manual.

paul
quelle
1
.bashrcist keine Konfigurationsdatei für Bash. .bashrcist ein Shell-Skript, das jedes Mal ausgeführt wird, wenn ein Bash-Prozess gestartet wird. Es kann verwendet werden, um Bash zu konfigurieren, aber es kann auch verwendet werden, um alle möglichen anderen Dinge zu tun: Es ist ein Skript, keine Konfigurationsdatei.
Josh
3

Einige Programme bieten eine Überprüfung der Konfigurationsdatei an, zum Beispiel:

postfix check

Andernfalls könnten Sie die ursprünglichen Konfigurationsdateien aus den Repositorys abrufen und sie mit diff mit der aktuellen vergleichen.

user78568
quelle
Eigentlich sieht es so aus, als würde das Kernproblem wirklich angegangen. Vielen Dank!
Dotancohen
2

Die Leerzeichen um das =Zeichen sind immer problematisch, wenn Sie eine Aufgabe in ausführen bash. Hier gibt es keine Ausnahme. Sie müssen alle Leerzeichen entfernen, =wenn Sie eine gültige einfache Zuweisung (keine Erweiterung, keine Arithmetik, keine Array-Zuweisung) erhalten möchten bash.

Für die Konfigurationsdatei bashbesteht keine Beziehung , da jede Software einen eigenen Parser zum Parsen ihrer Konfigurationsdatei hat. Sie müssen die Dokumentation lesen, um zu erfahren, welche Syntax in der Konfigurationsdatei zulässig ist.

Ein Beispiel ist mysql, dass es in seinem Init-Skript /etc/init.d/mysqldeinen Parser für Folgendes hat 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
cuonglm
quelle
Es gibt eine Ausnahme in (( var = 12 ))oder var=( value )oder $((var = 12))oder${var[foo = 12]}
Stéphane Chazelas
@ StéphaneChazelas: Haben Sie diese Fälle in dieser Frage nicht behandelt, fügen Sie Informationen hinzu. Vielen Dank.
Cuonglm