Khi không gian xung quanh dấu = bị cấm?


9

Tôi biết rằng trong ~ / .bashrc, người ta không được đặt khoảng trắng xung quanh =các dấu hiệu trong bài tập:

$ tail -n2 ~/.bashrc 
alias a="echo 'You hit a!'"
alias b = "echo 'You hit b!'"

$ a
You hit a!

$ b
b: command not found

Tôi đang xem lại tệp cấu hình MySQL /etc/my.cnfvà tôi đã tìm thấy tệp này:

tmpdir=/mnt/ramdisk
key_buffer_size = 1024M
innodb_buffer_pool_size = 512M
query_cache_size=16M

Làm thế nào tôi có thể xác minh rằng không gian xung quanh các =dấu hiệu không phải là một vấn đề?

Lưu ý rằng câu hỏi này không dành riêng cho /etc/my.cnftệp mà nói chung là * tệp cấu hình NIX nói chung. Xu hướng đầu tiên của tôi là RTFM nhưng thực tế man mysqlkhông đề cập đến vấn đề này và nếu tôi cần đi săn trực tuyến cho từng trường hợp, tôi sẽ không bao giờ đi đến đâu. Có bất kỳ quy ước hoặc cách dễ dàng để kiểm tra? Có thể thấy, nhiều người đã chỉnh sửa tệp này (các quy ước khác nhau cho =các dấu hiệu) và tôi không thể buộc tất cả họ không sử dụng khoảng trắng, tôi cũng không thể điên cuồng kiểm tra mọi thứ có thể đã được định cấu hình và có thể hoặc không thể chính xác.

EDIT: Ý định của tôi là đảm bảo rằng các tệp được cấu hình hiện tại được thực hiện đúng. Khi tự cấu hình các tệp, tôi đi theo quy ước về bất cứ thứ gì mà nhà bảo trì gói đặt trong đó.


2
Không có thứ gọi là "tập tin cấu hình NIX nói chung". Nếu tôi muốn cho phép khoảng trắng trong tệp cấu hình của mình, tôi sẽ viết chương trình của mình để cho phép chúng. Nếu tôi muốn tập tin cấu hình của mình sử dụng dấu hai chấm hoặc đường ống thay vì dấu bằng, thì tôi sẽ viết chương trình của mình để sử dụng chúng. Bash không yêu cầu không gian. Mysql cho phép họ.
thánh ca

Câu trả lời:


3

Tôi sẽ trả lời rằng theo một cách tổng quát hơn - nhìn một chút vào toàn bộ " trải nghiệm học tập Unix ".

Trong ví dụ của bạn, bạn sử dụng hai công cụ và xem ngôn ngữ là tương tự nhau. Nó chỉ không rõ ràng khi sử dụng chính xác những gì. Tất nhiên bạn có thể mong đợi có một cấu trúc rõ ràng , vì vậy bạn yêu cầu chúng tôi giải thích điều đó.
Trường hợp với không gian xung quanh =là duy nhất và ví dụ - có rất nhiều trường hợp tương tự nhưng khá bot .
Phải một logic trong đó, phải không?!

Các quy tắc làm thế nào để viết mã cho một số công cụ , shell, cơ sở dữ liệu, vv chỉ phụ thuộc vào những gì công cụ cụ thể này yêu cầu .

Điều đó có nghĩa là các công cụ hoàn toàn độc lập , về mặt kỹ thuật. Các mối quan hệ logic mà tôi nghĩ rằng bạn mong đợi chỉ đơn giản là không tồn tại .

Sự giống nhau rõ ràng của các ngôn ngữ bạn đang thấy không phải là một phần của việc thực hiện chương trình . Sự giống nhau tồn tại bởi vì các nhà phát triển đã đồng ý cách thực hiện khi họ viết nó xuống cho một chương trình cụ thể. Nhưng con người chỉ có thể đồng ý một phần .

Các mối quan hệ bạn đang nhìn thấy là một văn hóa điều - đó là không phải là một phần của thực hiện , cũng không phải trong định nghĩa của ngôn ngữ .



Vì vậy, bây giờ chúng ta đã xử lý lý thuyết, phải làm gì trong thực tế?

Một bước tiến lớn là chấp nhận rằng tính nhất quán mà bạn mong đợi không tồn tại - dễ dàng hơn nhiều khi hiểu lý do - tôi hy vọng phần lý thuyết sẽ giúp ích cho việc này.

Nếu bạn có hai công cụ, không sử dụng cùng một ngôn ngữ cấu hình (ví dụ: cả hai bash script), việc biết các chi tiết về cú pháp của một công cụ không giúp ích nhiều cho việc hiểu ngôn ngữ kia;
Vì vậy, thực sự, bạn sẽ phải tìm kiếm chi tiết một cách độc lập . Hãy chắc chắn rằng bạn biết nơi bạn tìm thấy các tài liệu tham khảo cho mỗi.

Về mặt tích cực, có một số tính nhất quán mà bạn không mong đợi: trong ngữ cảnh của một công cụ duy nhất (hoặc các công cụ khác nhau sử dụng cùng một ngôn ngữ), bạn có thể khá chắc chắn rằng cú pháp là nhất quán.
Trong mysqlví dụ của bạn , điều đó có nghĩa là bạn có thể giả sử rằng tất cả các dòng có cùng quy tắc. Vì vậy, nguyên tắc là "không gian trước và sau =không phù hợp ".

Có rất nhiều sự khác biệt trong cách cứng nó là để tìm hiểu hoặc sử dụng ngôn ngữ Configuration hoặc kịch bản của một công cụ.
Nó có thể là một số như " Liệt kê các giá trị foo trong cmd-foo.conf, một giá trị trên mỗi dòng."
Nó có thể là một ngôn ngữ kịch bản đầy đủ cũng được sử dụng ở nơi khác. Sau đó, bạn có một công cụ mạnh mẽ để viết cấu hình - và trong một số trường hợp thật tuyệt, trong những trường hợp khác, bạn sẽ thực sự cần điều đó.
Các công cụ phức tạp , hoặc các gia đình lớn của các công cụ liên quan đôi khi chỉ sử dụng cú pháp tệp cấu hình đặc biệt rất phức tạp - (một số ví dụ nổi tiếngsendmailvim).
Những người khác sử dụng một kịch bản chungngôn ngữ làm cơ sở và mở rộng ngôn ngữ đó để hỗ trợ các nhu cầu đặc biệt , đôi khi theo những cách phức tạp, như ngôn ngữ cho phép. Đó sẽ là một trường hợp rất cụ thể của ngôn ngữ dành riêng cho tên miền ( DSL ) .


Được chấp nhận vì đây là câu trả lời mà hầu hết giải quyết câu trả lời theo quan điểm của câu hỏi. Cảm ơn!
dotancohen

20

Bash sẽ diễn giải một dòng có văn bản theo sau =là một gán cho một biến, nhưng nó sẽ diễn giải một dòng có văn bản theo sau là khoảng trắng dưới dạng một lệnh với một đối số.

var=assignment đấu với command =argument

Các tập lệnh Bash hoạt động theo nguyên tắc rằng mọi thứ trong tập lệnh giống như bạn đã gõ nó vào dòng lệnh.

Trong các tệp cấu hình không được giải thích bởi bash(hoặc vỏ khác), nó sẽ được xác định bởi trình phân tích cú pháp được sử dụng để đọc tệp cấu hình. Một số trình phân tích cú pháp sẽ chiếm không gian, một số sẽ không. Tùy thuộc vào ứng dụng trong trường hợp đó. Cá nhân, tôi đi với bất kỳ quy ước nào mà tập tin cấu hình mặc định đã sử dụng.


Cảm ơn. Tôi lo lắng về cách kiểm tra các tệp còn tồn tại, hiện tại và trong tương lai, có thể đã được định cấu hình bởi các loại devops vừa chớm nở khác. Khi tự cấu hình các tệp, tôi đi theo quy ước về bất cứ thứ gì mà nhà bảo trì gói đưa vào đó, như bạn đề xuất. Tôi đã chỉnh sửa câu hỏi để làm rõ.
dotancohen

1
Tôi đoán nếu bạn kiểm tra các tệp hiện có, tôi sẽ kiểm tra tài liệu của sản phẩm và sử dụng nó làm ví dụ. Giả sử bạn có tài liệu và nó không phải là một ứng dụng được xây dựng tùy chỉnh. Nếu đó là một ứng dụng tùy chỉnh, tôi sẽ gắn bó với bất cứ thứ gì đã có. "Nếu nó không bị hỏng, đừng sửa nó"
Lawrence

Thật không may, một số trong số họ phá sản. Đó là lý do tại sao tôi hỏi!
dotancohen

Trong vỏ, đừng bao giờ sử dụng khoảng trắng xung quanh bằng. Trong bất cứ thứ gì không phải là vỏ, luôn luôn sử dụng khoảng trắng. Bạn có thể kiểm tra các tệp hiện có bằng grep: 'grep "[^] = [^]" / etc / *' để tìm tệp có an = không có khoảng trắng.
qris

2
@dotancohen (1.) Đối với bất kỳ tệp cấu hình nào, cần có ít nhất một cài đặt để kiểm tra xem nó có bị hỏng hay không. Cho dù một tập tin cấu hình cho phép không gian hay không, nó sẽ làm như vậy một cách nhất quán xuyên suốt. (2.) Bạn luôn có thể tải xuống một ứng dụng và kiểm tra cấu hình mặc định mà nó đi kèm. (3.) Bạn luôn có thể rời khỏi không gian hoàn toàn. a = bcó thể không phải lúc nào cũng được chấp nhận nhưng a=bnên luôn luôn hoạt động.
Nhà giả kim hai bit

4

.bashrc không có gì khác hơn là một tệp cấu hình cho bash, giống như my.cnf, php.ini, httpd.conf hoặc một trình khởi chạy. Mỗi loại có cú pháp riêng của chúng, từ phép gán bash không có khoảng trống đến súp thẻ XML của launchd (cũng có một phiên bản nhị phân: -O)

Không có ước công ty, và bạn đã phát hiện Thủ Chỉ thị của Unix: Đọc Các Fine Manual.


1
.bashrckhông một tập tin cấu hình cho bash. .bashrclà một tập lệnh shell mà bash chạy mỗi khi quá trình bash bắt đầu. Nó có thể được sử dụng để cấu hình bash nhưng nó cũng có thể được sử dụng để thực hiện tất cả các loại khác: đó là tập lệnh chứ không phải tập tin cấu hình.
Josh

3

Một số chương trình cung cấp kiểm tra tệp cấu hình, ví dụ:

postfix check

Nếu không, bạn có thể lấy các tệp cấu hình gốc từ kho lưu trữ và so sánh chúng với diff với hiện tại.


Trên thực tế, điều này có vẻ như nó thực sự giải quyết vấn đề cốt lõi. Cảm ơn!
dotancohen

2

Các khoảng trống xung quanh =dấu hiệu luôn có vấn đề khi bạn thực hiện một bài tập bash. Không có ngoại lệ ở đây, bạn phải xóa tất cả các khoảng trống xung quanh =nếu bạn muốn nhận một phép gán đơn giản hợp lệ (không mở rộng, không số học, không gán mảng) trong bash.

Đối với tệp cấu hình, vì mỗi phần mềm có trình phân tích cú pháp riêng để phân tích tệp cấu hình của nó, bashkhông có mối quan hệ. Bạn phải đọc tài liệu để biết cú pháp nào được phép trong tệp cấu hình.

Một ví dụ là mysql, trong tập lệnh init của nó /etc/init.d/mysqld, nó có một trình phân tích cú pháp cho 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

Có một ngoại lệ trong (( var = 12 ))hoặc var=( value )hoặc $((var = 12))hoặc${var[foo = 12]}
Stéphane Chazelas

@ StéphaneChazelas: Không có những trường hợp trong câu hỏi này, hãy thêm thông tin. Cảm ơn.
cuonglm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.