Có vấn đề với dấu gạch nối trong các chức năng, bí danh và thực thi không?


25

Trong thử nghiệm của tôi (trong Bash và Z Shell), tôi không thấy có vấn đề gì với việc xác định hàm hoặc bí danh hoặc tập lệnh shell thực thi có dấu gạch ngang trong tên, nhưng tôi không tin rằng điều này sẽ ổn trong mọi shell và trong mọi trường hợp sử dụng .

Lý do tôi muốn làm điều này là một dấu gạch nối dễ gõ hơn dấu gạch dưới, và do đó nhanh hơn và mượt mà hơn.

Một lý do khiến tôi ngần ngại tin rằng đó không phải là vấn đề là ở một số ngôn ngữ (ví dụ như Ruby), dấu gạch nối sẽ được hiểu là dấu trừ ngay cả khi không có khoảng trắng xung quanh nó. Tôi sẽ không ngạc nhiên nếu một cái gì đó như thế này có thể xảy ra trong một số vỏ, trong đó dấu gạch nối được hiểu là báo hiệu một tùy chọn ngay cả khi không có khoảng trắng.

Một lý do khác khiến tôi hơi nghi ngờ là trình soạn thảo văn bản của tôi làm nổi bật cú pháp tô sáng cho các chức năng bằng dấu gạch nối. (Nhưng tất nhiên có thể đó chỉ là một lỗi trong cấu hình tô sáng cú pháp của nó đối với các tập lệnh shell.)

Có bất kỳ lý do để tránh dấu gạch ngang?

Câu trả lời:


32

POSIX và Hyphens: Không bảo đảm

Theo tiêu chuẩn POSIX, tên hàm phải là tên hợp lệ và tên có thể bao gồm:

3.231 Tên
Trong ngôn ngữ lệnh shell, một từ chỉ bao gồm dấu gạch dưới, chữ số và bảng chữ cái từ bộ ký tự di động. Ký tự đầu tiên của tên không phải là chữ số.

Ngoài ra, bí danh phải là tên bí danh hợp lệ , có thể bao gồm:

3.10 Tên bí danh
Trong ngôn ngữ lệnh shell, một từ chỉ gồm dấu gạch dưới, chữ số và bảng chữ cái từ bộ ký tự di động và bất kỳ ký tự nào sau đây: '!', '%', ',', '@'.

Việc triển khai có thể cho phép các ký tự khác trong các tên bí danh như một phần mở rộng. (Nhấn mạnh của tôi.)

Một dấu gạch nối không được liệt kê trong số các ký tự phải được cho phép trong cả hai trường hợp. Vì vậy, nếu chúng được sử dụng, tính di động không được đảm bảo.

Ví dụ về Shell không hỗ trợ Hyphens

dashlà shell mặc định ( /bin/sh) trên họ debian-ub Ubuntu và nó không hỗ trợ dấu gạch nối trong tên hàm:

$ a-b() { date; }
dash: 1: Syntax error: Bad function name

Thật thú vị, nó không hỗ trợ dấu gạch nối trong các bí danh, mặc dù, như đã lưu ý ở trên, đây là một đặc điểm thực hiện , không phải là một yêu cầu:

$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world

Shell busybox (shell Almquist) cũng không hỗ trợ dấu gạch nối trong tên hàm:

$ a-b() { date; }
-sh: Syntax error: Bad function name

Tóm tắt về Hỗ trợ dấu gạch nối của Shell

Các shell sau đây được biết là hỗ trợ các dấu gạch nối trong tên hàm:

  • ksh, bash, zsh

Các shell sau đây được biết là không hỗ trợ dấu gạch nối trong tên hàm:

  • tro (busybox), csh, tcsh, dash

Kết luận

  • Hyphens là không chuẩn. Tránh xa chúng nếu bạn muốn tương thích xuyên vỏ.
  • Sử dụng dấu gạch dưới thay vì dấu gạch nối: dấu gạch dưới được chấp nhận ở mọi nơi.

2
Tên với -trong họ là xấu xa. Tôi đang nhìn bạn, CSS. :)
PM 2Ring

Cảm ơn. Tôi đã thử nghiệm sau này trong cshtcshvà họ không hỗ trợ dấu gạch nối, hoặc, nhưng Korn shell đã làm. Thật là buồn cười khi tôi cũng sử dụng a-b()như tên chức năng của mình.
iconoclast

@iconoclast Tôi đã thêm kết quả kiểm tra vỏ của bạn vào câu trả lời. Cảm ơn.
John1024

@ PM2Ring chúng dễ gõ hơn tên có dấu gạch dưới. Không bao gồm truyền thống hoặc quyết định thực hiện của các hệ thống không cho phép chúng, bạn có thể chỉ ra nguyên tắc nào để hỗ trợ cho tuyên bố rằng chúng là xấu xa?
iconoclast

1
@iconoclast Tên với dấu gạch ngang là không thể trong nhiều ngôn ngữ, vì dấu gạch nối được hiểu là dấu trừ, vì vậy nếu một ngôn ngữ như vậy cần phải tương tác với một ngôn ngữ hỗ trợ tên bằng dấu gạch nối, bạn sẽ gặp phải tình huống lộn xộn trong đó các thực thể có tên gạch nối bị buộc phải có một tên khác trong ngôn ngữ khác.
PM 2Ring

3

Tôi biết điều này thực sự muộn, nhưng có lẽ bạn có thể giải quyết vấn đề của mình để làm cho phần gạch dưới dễ tiếp cận hơn.

xmodmap -e "keycode  20 =  underscore minus"

Điều này sẽ chuyển gạch dưới với dấu gạch nối (trừ).

Vì vậy, bây giờ, bạn giữ shift cho dấu gạch nối, nhưng một dấu gạch dưới được gõ mà không có sự thay đổi.

Mã khóa của bạn có thể khác, tuy nhiên, tôi nghĩ nó phụ thuộc vào bàn phím của bạn; Của tôi xảy ra là 20. Chỉ cần cho tôi biết nếu bạn cần trợ giúp để tìm mã khóa nào bạn cần sử dụng.

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.