= 부호 주위의 공백은 언제 금지됩니까?


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 구성 파일 일반"과 같은 것은 없습니다. 구성 파일에 공백을 허용하려면 프로그램을 작성하여 공백을 허용합니다. 구성 파일에서 등호 대신 콜론 또는 파이프를 사용하려면이를 사용하도록 프로그램을 작성합니다. 배쉬에는 공백이 필요하지 않습니다. MySQL은 허용합니다.
hymie

답변:


3

좀 더 일반적인 방법으로 대답하겠습니다 . "Unix 학습 경험 " 전체를 조금 살펴보십시오 .

귀하의 예에서는 두 가지 도구를 사용하며 언어가 비슷하다는 것을 알 수 있습니다. 정확히 무엇을 사용 해야하는지 분명하지 않습니다. 물론 명확한 구조 가있을 것으로 기대할 수 있으므로 설명을 요청하십시오. 공간의 경우는 약 만 예입니다 - 많은의의가 비슷한하지만-봇 꽤 경우. 가 되어야한다 그것의 논리, 바로?!
=

규칙은 어떻게 일부 코드를 작성하는 도구 등이, 쉘, 데이터베이스 에만 의존 이 특정 도구는 무엇에 필요 .

즉, 도구 는 기술적 으로 완전히 독립적 입니다. 내가 생각 하는 논리적 관계존재하지 않습니다 .

당신이보고있는 언어 의 명백한 유사성프로그램 구현의 일부아닙니다 . 개발자가 특정 프로그램에 대해 작성했을 때이를 수행하는 방법에 동의 했기 때문에 유사성이 존재 합니다. 그러나 인간은 부분적으로 만 동의 할 수 있습니다 .

관계 당신이보고있는가이다 문화 일 - 그것의 의 일부 구현 , 나에 언어의 정의 .



이제 이론을 다루었으니 실제로 어떻게해야합니까?

큰 단계는 예상 한 일관성존재하지 않는다는 사실 을 받아들이 는 것입니다. 이유를 이해하면 훨씬 쉬울 것입니다. 저는 이론 부분이이를 도와 주길 바랍니다.

동일한 구성 언어를 사용하지 않는 두 개의 도구 (예 : bash 스크립팅)가있는 경우 하나의 구문 세부 사항을 아는 것이 다른 것을 이해하는 데 큰 도움이되지 않습니다.
따라서 실제로 세부 정보를 독립적 으로 찾아야합니다 . 각각에 대한 참조 문서 를 어디에서 찾을 수 있는지 확인하십시오 .

긍정적 인 측면에서는 예상하지 못한 일관성이 있습니다. 단일 도구 (또는 동일한 언어를 사용하는 다른 도구)의 맥락에서 구문이 일관되게 확신 할 수 있습니다.
귀하의 mysql예에서, 모든 라인이 동일한 규칙을 가지고 있다고 가정 할 수 있습니다. 따라서 규칙은 "전후 공백 =관련없습니다 "입니다.

도구의 구성 또는 스크립팅 언어를 배우거나 사용하는 것이 얼마나 어려운가 에는 큰 차이 가 있습니다 . " cmd-foo.conf에 foo 값 을 한 줄에 하나씩 나열하십시오." 와 같은 형식 일 수 있습니다 . 다른 곳에서도 사용되는 완전한 스크립팅 언어 일 수 있습니다 . 그런 다음 구성을 작성하는 강력한 도구가 있습니다. 어떤 경우에는 아주 좋으며 다른 경우에는 실제로 필요합니다. 복잡한 도구 또는 수많은 관련 도구가 때로는 매우 복잡한 특수 구성 파일 구문을 사용하기도 합니다 (일부 유명한 예는 및 ). 다른 사람들은 일반적인 스크립팅을 사용합니다


sendmailvim
언어를 기반으로하고 , 언어가 허용하는대로 복잡한 방식으로 특별한 요구 를 지원하기 위해 해당 언어를 확장 하십시오. 그것은 DSL (Domain-Specific Language )매우 특정한 경우이다 .


이것은 대부분 질문의 관점에서 답변을 다루는 답변이므로 허용됩니다. 감사!
dotancohen

20

Bash는 텍스트 다음에 =변수가 할당 된 줄이있는 줄을 해석하지만, 텍스트 뒤에 공백이있는 줄을 인수가있는 명령으로 해석합니다.

var=assignment vs command =argument

Bash 스크립트는 스크립트의 모든 것이 마치 명령 줄에 입력 한 것처럼 작동한다는 원칙에 따라 작동합니다.

해석되지 않는 구성 파일 bash(또는 다른 셸)에서는 구성 파일을 읽는 데 사용되는 파서에 의해 결정됩니다. 일부 파서는 공백을 사용하지만 일부 파서는 사용하지 않습니다. 이 경우 응용 프로그램에 달려 있습니다. 개인적으로, 나는 기본 구성 파일이 사용한 어떤 규약을 사용합니다.


감사. 현재와 ​​미래에 다른 신진 devops 유형으로 구성되었을 수있는 현존 파일을 확인하는 방법이 걱정됩니다. 파일을 직접 구성 할 때 패키지 관리자가 제안한대로 규칙을 따르십시오. 명확히하기 위해 질문을 편집했습니다.
dotancohen

1
기존 파일을 확인하는 경우 제품 설명서를 확인하고 예제로 사용합니다. 문서가 있고 사용자 정의 빌드 응용 프로그램이 아니라고 가정합니다. 그것이 커스텀 애플리케이션이라면, 나는 이미 존재했던 것을 고수 할 것입니다. "파산하지 않으면 해결하지 마십시오"
Lawrence

불행히도, 그들 일부 파산되었습니다. 내가 묻는 이유입니다!
dotancohen

쉘에서는 등호 주위에 공백을 사용하지 마십시오. 쉘이 아닌 것은 항상 공백을 사용하십시오. grep : 'grep "[^] = [^]"/ etc / *'를 사용하여 기존 파일을 감사하여 공백이없는 =를 가진 파일을 찾을 수 있습니다.
qris

2
@dotancohen (1.) 구성 파일의 경우 구성이 깨 졌는지 쉽게 확인할 수있는 설정이 하나 이상 있어야합니다. 구성 파일이 공백을 허용하는지 여부에 관계없이 전체적으로 일관성있게 수행해야합니다. (2.) 항상 응용 프로그램을 다운로드하고 기본 구성을 확인할 수 있습니다. (3) 당신은 항상 공백을 모두 남겨 둘 수 있습니다. a = b항상 허용되는 것은 아니지만 a=b항상 작동해야합니다.
2 비트 연금술사

4

.bashrc는 my.cnf, php.ini, httpd.conf 또는 시작된 plist와 같이 bash의 구성 파일에 지나지 않습니다. 각각은 bash의 빈 공간 할당에서 시작된 XML 태그 수프에 이르기까지 자체 구문이 있습니다 (이진 버전도 있습니다 : -O)

확고한 규약이 없으며 이미 Unix의 주요 지침을 발견했습니다 . 훌륭한 매뉴얼을 읽으십시오 .


1
.bashrcbash의 구성 파일 이 아닙니다 . .bashrcA는 쉘 스크립트 bash는이 때마다 떠들썩한 파티 프로세스 시작을 실행합니다. bash를 구성하는 데 사용할 수 있지만 모든 종류의 다른 작업을 수행하는데도 사용할 수 있습니다. 구성 파일이 아니라 스크립트입니다.
Josh

3

일부 프로그램은 구성 파일 검사를 제공합니다 (예 :

postfix check

그렇지 않으면 리포지토리에서 원본 구성 파일을 가져 와서 현재와 diff와 비교할 수 있습니다.


실제로 이것은 실제로 핵심 문제를 해결하는 것처럼 보입니다. 감사!
dotancohen

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.