Quando sono vietati gli spazi attorno al segno =?


9

So che in ~ / .bashrc non si devono mettere spazi attorno ai =segni nell'assegnazione:

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

$ a
You hit a!

$ b
b: command not found

Sto rivedendo il file di configurazione di MySQL /etc/my.cnfe ho trovato questo:

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

Come posso verificare che gli spazi attorno ai =segni non siano un problema?

Si noti che questa domanda non è specifica per il /etc/my.cnffile, ma piuttosto per i file di configurazione * NIX in generale. La mia prima inclinazione è verso RTFM, ma in realtà man mysqlnon menziona il problema e se devo andare a caccia online per ogni caso, non arriverò mai da nessuna parte. Esiste una convenzione o un modo semplice per verificare? Come si può vedere, più persone hanno modificato questo file (diverse convenzioni per i =segni) e non posso né obbligarli tutti a non usare spazi, né posso impazzire controllando tutto ciò che potrebbe essere stato configurato e che potrebbe non essere corretto.

EDIT: la mia intenzione è quella di garantire che i file attualmente configurati vengano eseguiti correttamente. Quando configuro i file da solo, vado con la convenzione di qualunque cosa il manutentore del pacchetto abbia inserito.


2
Non esistono "* file di configurazione NIX in generale". Se voglio consentire spazi nel mio file di configurazione, scriverò il mio programma per consentirli. Se voglio che il mio file di configurazione utilizzi due punti o pipe anziché segni di uguale, allora scriverò il mio programma per usarli. Bash non richiede spazi. Mysql glielo permette.
hymie,

Risposte:


3

Ti risponderò in modo più generale , guardando un po 'l'intera " esperienza di apprendimento Unix ".

Nel tuo esempio usi due strumenti e vedi che la lingua è simile. Non è chiaro quando usare esattamente cosa. Ovviamente puoi aspettarti che ci sia una struttura chiara , quindi ci chiedi di spiegarlo.
Il caso con lo spazio intorno =è solo un esempio: ci sono molti casi simili ma piuttosto bot .
Ci deve essere una logica in esso, giusto ?!

Le regole su come scrivere il codice per alcuni strumenti , shell, database ecc dipendono solo da ciò che richiede questo particolare strumento .

Ciò significa che gli strumenti sono completamente indipendenti , tecnicamente. La relazione logica che penso ti aspetti semplicemente non esiste .

L'ovvia somiglianza delle lingue che vedi non fa parte dell'implementazione del programma . La somiglianza esiste perché gli sviluppatori avevano concordato come farlo quando l'hanno scritta per un determinato programma. Ma gli umani possono essere d'accordo solo parzialmente .

La relazione che state vedendo è una cultura cosa - è parte della realizzazione , né nel definizione del linguaggio .



Quindi, ora che abbiamo trattato la teoria, cosa fare in pratica?

Un grande passo è accettare che non esista la coerenza che ci si aspettava - il che è molto più semplice quando si capiscono le ragioni - spero che la parte teorica aiuti in questo.

Se hai due strumenti, che non usano lo stesso linguaggio di configurazione (es. Entrambi script bash), conoscere i dettagli della sintassi di uno non aiuta molto a capire l'altro;
Quindi, in effetti, dovrai cercare i dettagli in modo indipendente . Assicurati di sapere dove trovare la documentazione di riferimento per ciascuno.

Sul lato positivo, c'è una certa coerenza in cui non te lo aspettavi: nel contesto di un singolo strumento (o strumenti diversi che usano la stessa lingua), puoi essere abbastanza sicuro che la sintassi sia coerente.
Nel tuo mysqlesempio, ciò significa che puoi presumere che tutte le linee abbiano la stessa regola. Quindi la regola è "lo spazio prima e dopo non= è rilevante ".

Esistono grandi differenze nella difficoltà di apprendere o utilizzare il linguaggio di configurazione o di scripting di uno strumento.
Può essere un po 'come " Elenca i valori foo in cmd-foo.conf, uno per riga.".
Può essere un linguaggio di scripting completo utilizzato anche altrove. Quindi hai un potente strumento per scrivere la configurazione - e in alcuni casi è semplicemente bello, in altri ne avrai davvero bisogno.
Strumenti complessi o famiglie numerose di strumenti correlati a volte usano solo una sintassi di file di configurazione speciale molto complessa (alcuni esempi famosi sono sendmaile vim).
Altri usano uno scripting generalelingua come base ed estendere quella lingua per supportare le esigenze speciali , a volte in modi complessi, come la lingua lo consente. Sarebbe un caso molto specifico di un linguaggio specifico del dominio ( DSL ) .


Accettata in quanto questa è la risposta che più si rivolge alla risposta dal punto di vista della domanda. Grazie!
dotancohen,

20

Bash interpreterà una riga con testo seguito da a =come assegnazione a una variabile, ma interpreterà una linea con testo seguito da uno spazio come comando con un argomento.

var=assignment vs command =argument

Gli script Bash funzionano secondo il principio che tutto nello script è come se fosse stato digitato nella riga di comando.

Nei file di configurazione che non sono interpretati da bash(o da un'altra shell), sarà determinato dal parser utilizzato per leggere il file di configurazione. Alcuni parser occuperanno spazi, altri no. Dipende dall'applicazione in quel caso. Personalmente, vado con qualunque convenzione abbia usato il file di configurazione predefinito.


Grazie. Sono preoccupato per come controllare i file esistenti, ora e in futuro, che potrebbero essere stati configurati da altri tipi di devops in erba. Quando configuro i file da solo, vado con la convenzione di qualunque cosa il manutentore del pacchetto abbia inserito, come suggerisci tu. Ho modificato la domanda per chiarire.
dotancohen,

1
Immagino che se controlli i file esistenti, controllerei la documentazione del prodotto e la userei come esempio. Supponendo che tu abbia la documentazione e non sia un'applicazione personalizzata. Se fosse un'applicazione personalizzata, rimarrei con qualsiasi cosa fosse già lì. "Se non è rotto, non aggiustarlo"
Lawrence,

Sfortunatamente, alcuni di loro sono al verde. Ecco perché lo sto chiedendo!
dotancohen,

Nelle shell, non usare mai spazi attorno a un uguale. In tutto ciò che non è una shell, usa sempre gli spazi. Puoi controllare i file esistenti usando grep: 'grep "[^] = [^]" / etc / *' per trovare i file con un = che non ha spazi.
Qris,

2
@dotancohen (1.) Per qualsiasi file di configurazione, ci dovrebbe essere almeno un'impostazione che sarebbe piuttosto facile controllare se è rotto. Se un file di configurazione consente spazi o meno, dovrebbe farlo in modo coerente in tutto. (2.) È sempre possibile scaricare un'applicazione e verificare le configurazioni predefinite con cui viene fornita. (3.) Puoi sempre tralasciare del tutto gli spazi. a = bpotrebbe non essere sempre accettabile, ma a=bdovrebbe sempre funzionare.
Two-Bit Alchemist,

4

.bashrc non è altro che un file di configurazione per bash, proprio come my.cnf, php.ini, httpd.conf o un programma di avvio. Ognuno ha la propria sintassi, che va dall'assegnazione senza spazio di bash alla minestra di tag XML di launchd (c'è anche una versione binaria: -O)

Non ci sono convenzioni ferme e hai già scoperto la Direttiva Prime di Unix: leggi il Manuale Fine .


1
.bashrcnon è un file di configurazione per bash. .bashrcè uno script shell che bash viene eseguito ogni volta che inizia un processo bash. Può essere usato per configurare bash ma può anche essere usato per fare ogni altra cosa: è uno script, non un file di configurazione.
Josh,

3

Alcuni programmi offrono un controllo del file di configurazione, ad esempio:

postfix check

Altrimenti potresti ottenere i file di configurazione originali dai repository e confrontarli con diff con l'attuale.


In realtà, sembra che affronti davvero il problema principale. Grazie!
dotancohen,

2

Gli spazi attorno al =segno sono sempre un problema quando si esegue un compito bash. Non ci sono eccezioni qui, è necessario rimuovere tutti gli spazi =se si desidera ottenere un'assegnazione semplice valida (nessuna espansione, nessuna aritmetica, nessuna assegnazione di array) bash.

Per il file di configurazione, poiché ogni software ha il proprio parser per analizzare il suo file di configurazione, bashnon ha alcuna relazione. È necessario leggere la documentazione per sapere quale sintassi è consentita nel file di configurazione.

Un esempio è mysql, nel suo script init /etc/init.d/mysqld, ha un parser per 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

C'è un'eccezione in (( var = 12 ))o var=( value )oppure $((var = 12))oppure${var[foo = 12]}
Stéphane Chazelas,

@ StéphaneChazelas: non ho parlato di quei casi in questa domanda, aggiungere informazioni. Grazie.
cuonglm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.