title: Bash - How to discriminate control operator from metacharacter?
body: <p>According to <a href="http://www.gnu.org/software/bash/manual/bashref.html" rel="nofollow noreferrer">bash manual</a>:</p>
  <blockquote>
  <p><code>control operator</code></p>
  <p>A token that performs a control function. It is a <strong>newline</strong> or one of the following: ‘||’, ‘&amp;&amp;’, ‘&amp;’, ‘;’, ‘;;’, ‘|’, ‘|&amp;’, ‘(’, or ‘)’.</p>
  <p><code>metacharacter</code></p>
  <p>A character that, when unquoted, separates words. A metacharacter is a <strong>blank</strong> or one of the following characters: ‘|’, ‘&amp;’, ‘;’, ‘(’, ‘)’, ‘&lt;’, or ‘&gt;’.</p>
  </blockquote>
  <p>Many characters are both <code>control operator</code> and <code>metacharacter</code>.</p>
  <p>So how could I konw the syntax category of e.g. a <code>;</code>?</p>
  <p>Take <code>if COND ; then CMD ; fi</code> as an example.</p>
  <p><code>;</code> seems like a <code>control operator</code> in the context, for it can be substituted by <strong>newline</strong>.
  However removing pre and post <strong>space</strong>s around <code>;</code> still works ok.
  Isn't it supposed to be separated by sapces if it's an <strong>operator</strong>?</p>