=記号の周りのスペースはいつ禁止されますか?


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 14

回答:


3

私はより一般的な方法でそれに答えます-「Unix 学習体験」全体を少し見てください。

あなたの例では、2つのツールを使用し、言語が似ていることを確認します。正確に何を使用するかは不明です。もちろん、明確な構造があることを期待できますので、説明をお願いします。 周りにスペースがあるケースは単なる例であり、類似しているがボットはかなりのケースがたくさんあります。 そこロジックが必要ですよね?!
=

一部のツール、シェル、データベースなどのコードを記述する方法のルールは、この特定のツールが必要とするものにのみ依存ます

つまり、ツールは技術的に完全に独立しています論理的な関係私はあなたが単純に期待だと思うことは存在しません

あなたが見ている言語の明らかな類似性、プログラムの実装の一部ではありません開発者が特定のプログラムのためにそれを書き留めたときにそれを行う方法に同意したため、類似点が存在ます。しかし、人間は部分的にしか同意できません。

関係あなたが見ているのである文化的なもの-それはだどちらの一部の実装、また中に言語の定義



それで、私たちは理論を手に入れましたので、実際に何をすべきですか?

大きな一歩は、期待一貫性存在しないことを受け入れることです。理由を理解する方がはるかに簡単です。理論の部分がこれに役立つことを願っています。

同じ構成言語を使用しない2つのツールがある場合(たとえば、両方のbashスクリプト)、一方の構文の詳細を知っていても、もう一方を理解するのにあまり役立ちません。
そのため、実際には、詳細を個別に検索する必要があります。それぞれのリファレンスドキュメントがどこにあるかを確認してください。

肯定的な面では、予想外の一貫性があります。単一のツール(または同じ言語を使用する異なるツール)のコンテキストでは、構文が一貫しているとかなり確信で​​きます。
あなたのmysql例では、それはあなたがすべての行が同じルールを持っていると仮定できることを意味します。したがって、ルールは「前後のスペースは関係=ありません」です。

ツールの構成言語またはスクリプト言語を学習または使用するのがいかに難しいかには、大きな違いがあります。 「cmd-foo.confのfooの値を1行に1つずつリストする」のようになります。他の場所でも使用される 完全なスクリプト言語にすることもできます。次に、構成を作成するための強力なツールがあります。場合によってはそれで十分な場合もあれば、本当に必要な場合もあります。複雑なツール、または関連ツールの大規模なファミリは、非常に複雑な特別な構成ファイル構文を使用する場合があります(いくつかの有名な例はandです)。 その他は一般的なスクリプトを使用します


sendmailvim
言語をベースとして使用し、その言語を拡張して、特殊なニーズをサポートするように、場合によっては複雑な方法で、言語が許可するようにします。これは、ドメイン固有言語(DSL)の非常に特殊なケースです。


これは、ほとんどの場合、質問の観点からの回答に対応する回答であると認められています。ありがとう!
dotancohen 2014

20

bashは、テキストの後にaが続く行を=変数への割り当てとして解釈しますが、テキストの後にスペースが続く行は、引数付きのコマンドとして解釈します。

var=assignmentcommand =argument

Bashスクリプトは、スクリプト内のすべてがコマンドラインに入力した場合と同じであるという原則に基づいて機能します。

bash(または別のシェル)によって解釈されない構成ファイルでは、構成ファイルの読み取りに使用されるパーサーによって決定されます。一部のパーサーはスペースを使用しますが、一部は使用しません。その場合のアプリケーション次第です。個人的には、デフォルトの構成ファイルで使用されている規則に従っています。


ありがとう。現在、そして将来、他の新進のdevopsタイプによって構成された可能性のある現存するファイルをチェックする方法が心配です。私が自分でファイルを設定するとき、私はあなたが提案するように、パッケージメンテナがそこに置いたものの慣習に従います。明確にするために質問を編集しました。
dotancohen 2014

1
あなたが既存のファイルをチェックしているなら、私は製品のドキュメントをチェックし、それを例として使用すると思います。あなたがドキュメントを持っていて、それがカスタムビルドされたアプリケーションではないと仮定します。それがカスタムアプリケーションの場合は、既に存在するものをそのまま使用します。「壊れていない場合は修正しないでください」
ローレンス

残念ながら、それらのいくつか壊れています。それが私が求めている理由です!
dotancohen 2014

シェルでは、イコールの周りにスペースを使用しないでください。シェル以外のものでは、常にスペースを使用します。grep: 'grep "[^] = [^]" / etc / *'を使用して既存のファイルを監査し、スペースを含まない=を含むファイルを検索できます。
qris 2014

2
@dotancohen(1.)構成ファイルには、壊れているかどうかを簡単に確認できる設定が少なくとも1つ必要です。構成ファイルでスペースが許可されているかどうかにかかわらず、それは一貫してそうする必要があります。(2.)いつでもアプリケーションをダウンロードして、アプリケーションに付属するデフォルトの設定を確認できます。(3.)スペースはすべて省略できます。a = b常に許容できるわけではありませんが、a=b常に機能するはずです。
2ビットの錬金術師

4

.bashrcは、my.cnf、php.ini、httpd.confまたはlaunchd plistと同様に、bashの構成ファイルにすぎません。それぞれに独自の構文があり、bashのスペースなしの割り当てから、launchdのXMLタグスープまであります(バイナリバージョン:-Oもあります)。

確固たる慣例はなく、Unixのプライムディレクティブであるファインマニュアルを既にお読みになっています。


1
.bashrcはbashの設定ファイルではありません。bashプロセスが開始するたびにbashが実行.bashrcするシェルスクリプトです。これはbashの設定に使用できますが、他のあらゆる種類の処理にも使用できます。これはスクリプトであり、設定ファイルではありません。
Josh

3

一部のプログラムは、構成ファイルのチェックを提供します。次に例を示します。

postfix check

それ以外の場合は、リポジトリから元の構成ファイルを取得して、現在のファイルとの差分と比較できます。


実際、これは本当にコアの問題に対処しているように見えます。ありがとう!
dotancohen 2014

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]}
ステファンChazelas

@StéphaneChazelas:この質問のケースについては説明しませんでした。情報を追加してください。ありがとう。
cuonglm 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.