什么时候禁止在=号周围使用空格?


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 2014年

Answers:


3

我将以更一般的方式回答该问题-稍微看一下整个“ Unix 学习体验 ”。

在您的示例中,您使用了两种工具,并且看到的语言是相似的。只是不清楚何时确切使用什么。当然,您可以期望有一个清晰的结构,因此请您对此进行解释。
周围=只有空格的情况只是一个例子-有很多类似但机器人相当的情况。
其中必须有逻辑,对吧?

如何为某些工具,shell,数据库等编写代码的规则仅取决于此特定工具的要求

这意味着这些工具在技术上是完全独立的。我认为您所期望的逻辑关系根本不存在

您所看到的语言的明显相似之处不是程序实现的一部分。之所以存在相似之处,是因为开发人员在为特定程序写下该代码时已经同意如何做。但是人类只能部分同意。

您看到的关系是一种文化的东西-它既不是实现的一部分,也不是语言定义



那么,既然我们已经掌握了该理论,那么该怎么做呢?

迈出一大步是接受您所期望的一致性不存在 -在理解原因时这容易得多-我希望理论部分可以帮助您解决这一问题。

如果您有两个不使用相同配置语言的工具(例如,两个bash脚本都使用),那么了解一种语法的详细信息对理解另一种语法无济于事。
因此,确实,您将必须独立查找细节。确保知道在哪里可以找到每个参考文档参考

从积极的一面来看,在您未曾期望的地方有一些一致性:在单个工具(或使用相同语言的不同工具)的上下文中,您可以确定语法是一致的。
在您的mysql示例中,这意味着您可以假定所有行都具有相同的规则。所以规则是“前空间和后=不相关的。”

有广泛的差异如何是学习或使用工具的配置-或脚本语言。
可以类似于“ 在cmd-foo.conf中列出foo值,每行列出一个”。
它可以是完整的脚本语言,也可以在其他地方使用。然后,您将拥有一个功能强大的工具来编写配置-在某些情况下这很好,而在其他情况下,您将真正需要它。
复杂的工具或大型的相关工具有时仅使用非常复杂的特殊配置文件语法-(和是一些著名的示例)。 其他人使用通用脚本sendmailvim
以语言为基础,并在语言允许的情况下以复杂的方式扩展该语言以支持特殊需求。那将是领域特定语言(DSL非常特定的情况。


公认的是,从问题的角度来看,最能回答该问题的答案。谢谢!
dotancohen

20

Bash将解释一行文本后接a =作为变量的赋值,但是它将解释一行文本后接空格作为带有参数的命令。

var=assignmentcommand =argument

Bash脚本的工作原理是脚本中的所有内容就像您在命令行中键入的一样。

bash(或其他外壳程序)不解释的配置文件中,它将由用于读取配置文件的解析器确定。有些解析器会占用空间,有些则不会。在这种情况下,取决于应用程序。就个人而言,我会遵循默认配置文件使用的任何约定。


谢谢。我担心现在和将来如何检查现有的文件,这些文件可能是由其他萌芽的devops类型配置的。当您自己配置文件时,按照您的建议,我遵循软件包维护者放在其中的约定。我已编辑问题以澄清问题。
dotancohen 2014年

1
我想如果您检查现有文件,我会检查产品文档并以该文件为例。假设您有文档,并且它不是定制的应用程序。如果这是一个自定义应用程序,那么我会坚持使用已有的内容。“如果没有破裂,请不要修复”
劳伦斯

不幸的是,他们中的一些破产了。这就是为什么我要问!
dotancohen 2014年

在壳中,永远不要在等号周围使用空格。在不是外壳的任何东西中,请始终使用空格。您可以使用grep审计现有文件:'grep“ [^] = [^]” / etc / *'查找带有=且没有空格的文件。
qris 2014年

2
@dotancohen(1.)对于任何配置文件,至少应有一个设置,它很容易检查它是否损坏。无论配置文件是否允许空格,它都应始终保持一致。(2.)您始终可以下载应用程序并检查其附带的默认配置。(3.)您总是可以完全省去空格。a = b可能并不总是可以接受的,但a=b应该始终有效。
两位炼金术士2014年

4

.bashrc仅仅是bash的配置文件,就像my.cnf,php.ini,httpd.conf或启动的plist一样。每个都有自己的语法,范围从bash的无空间分配到启动的XML标签汤(还有二进制版本:-O)。

没有严格的约定,并且您已经发现了Unix的主要指令:请阅读Fine Manual。


1
.bashrc不是对于bash配置文件。.bashrc是一个shell脚本,每次bash进程启动时bash都会运行。它可以用来配置bash,但也可以用来做其他各种事情:它是一个脚本,而不是配置文件。
2014年

3

某些程序提供对配置文件的检查,例如:

postfix check

否则,您可以从存储库中获取原始配置文件,并将它们与diff比较与当前版本。


实际上,这看起来确实确实解决了核心问题。谢谢!
dotancohen

2

=当您在中进行分配时,符号周围的空格始终是个问题bash。这里也不例外,=如果要在in中获得有效的简单赋值(无扩展,无算术,无数组赋值),必须删除周围的所有空格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年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.