= 符号周围的空格何时被禁止?

= 符号周围的空格何时被禁止?

我知道在 ~/.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没有提及这个问题,如果我需要在网上寻找每个案例,我将永远不会有任何结果。有什么约定或简单的方法可以检查吗?可以看出,多个人编辑了这个文件(=符号的不同约定),我既不能强迫他们全部不使用空格,也不能疯狂地检查可能已配置的所有内容,并且可能正确也可能不正确。

编辑:我的目的是确保当前配置的文件正确完成。当我自己配置​​文件时,我会遵循包维护者在其中放置的任何内容的约定。

答案1

Bash 会将文本后跟 a 的行解释为=对变量的赋值,但会将文本后跟空格的行解释为带参数的命令。

var=assignmentcommand =argument

Bash 脚本的工作原理是,脚本中的所有内容都就像您将其输入到命令行中一样。

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

答案2

.bashrc只不过是bash的配置文件,就像my.cnf、php.ini、httpd.conf或launchd plist一样。每个都有自己的语法,从 bash 的无空格赋值到 launchd 的 XML 标签汤(还有一个二进制版本 :-O )

没有固定的约定,您已经发现了 Unix 的最高指令:阅读美好的手动的。

答案3

我将在更多内容中回答这个问题一般的方式 - 稍微看一下整个“Unix学习经验”。

在您的示例中,您使用两个工具,并且看到语言是相似的。只是不清楚何时具体使用什么。当然你可以期待有一个明确的结构,所以你要求我们解释一下。
周围有空间的情况=只是一个例子 - 有很多相似但相当机器人案例。
那里必须里面有一个逻辑,正确的?!

规则如何为某些人编写代码工具、shell、数据库等只取决于关于这个特定工具的需要

这意味着工具完全是独立的,从技术上来说。这逻辑关系我认为你只是期望不存在

显而易见的相似您看到的语言是不属于该计划的一部分执行。存在相似性是因为开发商已同意当他们为特定程序写下它时如何做到这一点。但人类只能同意部分地

关系你看到的是一个文化东西——它是两者都不的一部分执行,也不在语言的定义



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

一大步是接受认为一致性你期望的不存在- 当理解了之后就容易多了原因- 我希望理论部分对此有所帮助。

如果您有两个工具,它们不使用相同的配置语言(例如,都是 bash 脚本),那么了解其中一个工具的语法细节对于理解另一个工具并没有多大帮助;
所以,确实,你必须查找独立详细说明。确保您知道在哪里可以找到参考文档对于每个。

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

有宽差异怎样难的它是学习或使用工具的配置或脚本语言。
它可以是一些像“列出 foo 值在 cmd-foo.conf 中,每行一个。”。
它可以是一个完整的脚本语言这也在其他地方使用。然后你就有了一个强大的工具来编写配置 - 在某些情况下这很好,但在其他情况下你确实需要它。
复杂的工具,或者相关工具的大家族有时只是使用非常复杂的特殊配置文件语法 - (一些著名的例子是sendmailvim)。
其他人使用通用脚本语言作为基础,并且延长该语言支持特殊需求,有时在语言允许的情况下以复杂的方式。那将是一个非常具体的情况领域特定语言(DSL

答案4

=当您在 中进行作业时,符号周围的空格始终是问题bash。这里也不例外,=如果你想在 中获得有效的简单赋值(无扩展、无算术、无数组赋值),则必须删除周围的所有空格bash

对于配置文件,因为每个软件都有自己的解析器来解析其配置文件,所以bash没有关系。您必须阅读文档以了解配置文件中允许使用哪些语法。

一个例子是mysql,在它的初始化脚本中/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

相关内容