Một lệnh Linux có thể có chữ in hoa không?


17

Một lệnh Linux có thể có chữ in hoa không? Tôi biết nó được hỗ trợ nhưng tôi muốn chắc chắn nếu đó là "vấn đề" hoặc được coi là "không phải là một điều tốt"?


6
Quy ước UNIX là sử dụng chữ thường cho tên lệnh, nhưng bạn có thể gọi chúng theo bất cứ cách nào bạn muốn.

1
Thật vậy, UNIX không quan tâm bạn gọi lệnh của bạn là gì. Nó sẽ gây ra nhiều đau đớn và đau khổ, nhưng bạn thậm chí có thể có các lệnh có khoảng trắng trong đó: echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"tạo ra hello worldnhư mong đợi. (Giả sử ~/binlà trong của bạn $PATH, tất nhiên).
derobert

Kiểm tra câu hỏi này và hướng dẫn có lẽ quá dài của tôi .
Emanuel Berg

Câu trả lời:


13

Không có giới hạn về tên lệnh trên Unix. Bất kỳ tập tin có thể là một lệnh. Và một tên tệp có thể là bất kỳ chuỗi nào gồm một hoặc nhiều (mặc dù đến giới hạn) của các ký tự không phải là ASCII NUL hoặc ASCII /. zshthậm chí nâng giới hạn cho các hàm trong đó bạn có thể có bất kỳ chuỗi nào làm tên hàm.

Một vài lưu ý mặc dù:

  • bạn sẽ gặp khó khăn khi tạo một tệp lệnh được gọi là .hoặc ..;-).
  • tên tránh được đã được sử dụng bởi các lệnh chuẩn hoặc builtins vỏ hoặc từ khóa (ít nhất là trong những vỏ phổ biến nhất như bash, zsh, tcshhoặc ksh). Về mặt đó, các ký tự chữ hoa có thể giúp ích vì chúng thường không được sử dụng bởi các lệnh tiêu chuẩn.
  • Tốt hơn hết là hạn chế ký tự ASCII. Các ký tự không phải ASCII không được thể hiện giống nhau trong các bộ ký tự khác nhau ngoài kia
  • trong khi bạn đang ở đó, hãy giới hạn bản thân trong các chữ cái, chữ số, dấu gạch ngang, dấu chấm và dấu gạch dưới. Bất cứ điều gì khác, trong khi pháp luật, có thể gây ra một vấn đề này hay cách khác với điều này hoặc công cụ (ví dụ |, =, &và nhiều người khác sẽ cần phải được thoát trong vỏ, nếu bạn sử dụng :, lệnh của bạn không thể được sử dụng như vỏ đăng nhập của một người ... ). Bạn thậm chí có thể muốn loại trừ .-không được phép trong tên hàm trong nhiều shell, trong trường hợp bạn muốn cho phép người dùng bọc lệnh của bạn trong hàm shell.
  • Làm cho nhân vật đầu tiên một chữ cái. Một lần nữa, không phải là một yêu cầu nghiêm ngặt. Nhưng gạch dưới đôi khi được sử dụng cho những thứ đặc biệt (như trong zshcác chức năng từ các hệ thống hoàn thành bắt đầu bằng _) và các lệnh toàn chữ số có thể là một vấn đề trong những thứ như cmd>output.log. Các tệp có tên bắt đầu bằng dấu chấm sẽ bị ẩn bởi những thứ như lshoặc vỏ toàn cầu và nhiều trình quản lý tệp.

Đúng. Vì vậy, tôi đoán nó sôi lên, đừng sử dụng bất cứ thứ gì khác thường trừ khi bạn có lý do chính đáng để làm điều đó. Ngay cả điểm thứ hai của bạn, tôi không nghĩ sử dụng chữ hoa để che những cái vỏ đó là thông minh - tốt hơn hết là đặt tên cho lệnh để mô tả sự thay đổi? Giống như, zsh_with_some_funky_option(thay vì ZSH)?
Emanuel Berg

Bí danh là một lệnh? Bởi vì nếu có, tôi đã có thời gian gõ rất dễ dàng alias .="echo Hello".-) (Chà, sudo vim /bin/.khó hơn, mặc dù ...)
Alois Mahdal

@AloisMahdal Đó là lý do tại sao tôi nói tập tin lệnh . zsh cũng cho phép .() echo Hello. Pdksh cũng vậy, nhưng .nội dung đặc biệt được ưu tiên ở đó.
Stéphane Chazelas

Rất tiếc, tôi đã đọc sai ... Điểm thú vị về các tiền lệ pdksh, mặc dù ...
Alois Mahdal

27

Có nó có thể, và đã có một vài. Chẳng hạn như /usr/bin/X:)

dennis@lightning:~$ ls {/usr{/local,},}/{s,}bin | grep '[A-Z]'
MAKEDEV
amuFormat.sh
GET
HEAD
Mail
POST
X
X11
Xephyr
Xnest
Xorg
NetworkManager

dennis@lightning:~$ zcat ~/.cache/apt-file /archive.ubuntu.com_ubuntu_dists_precise_Contents-i386.gz | tail -n +33 | cut -f1 | grep -P '^(usr/)?s?bin/.*[A-Z]' | wc -l
758

Vậy là 758 trong tất cả Ubuntu 12.04. Danh sách đầy đủ: https://gist.github.com/5264777


Không Xdialog? : o Và bạn nên trích dẫn greptham số để tránh shell mở rộng nó trong thư mục hiện tại trước khi thực hiện.
manatwork

Đừng cài đặt nó trên hệ thống này :)
Dennis Kaarsemaker 28/03/13

2
Tôi muốn nhấn mạnh vào việc trích dẫn greptham số: pastebin.com/Gak7x9rN (Vâng, tôi có thể tự chỉnh sửa nó, nhưng tôi muốn bạn hiểu lý do tại sao.)
manatwork 29/03/13

1
Vâng, nó có thể phụ thuộc vào vỏ quá. Tôi đã sử dụng chữ hoa trong ví dụ của mình cho tính di động, nhưng bashtrong thư mục nhà của tôi thực sự mở rộng [A-Z]ra đến cdfhjmpqrtiến. Vì vậy, trường hợp vô cảm.
manatwork

1
Không đề cập đến zshhoặc failglobtùy chọn bash . Cá nhân tôi thường đặt tên cho tập tin tạm thời của tôi (trong ~) a, b, c... và tôi dirs tạm thời A, B, C...
Stéphane Chazelas

4

Lệnh nổi tiếng nhất là stty, cũng có sẵn như STTY. Nó rất thuận tiện để đặt thiết bị đầu cuối trở lại hoạt động bình thường với STTY SANE.


Tôi có /bin/sttynhưng không có gì khác. Quan tâm để xây dựng câu trả lời của bạn một chút?
Emanuel Berg

2
Trong những ngày xưa tốt đẹp, có thể thiết bị đầu cuối của bạn trở nên quá rối, rằng mọi thứ đều là chữ hoa. Vì vậy, gõ avà thiết bị đầu cuối sẽ thấy A. Để khôi phục sự tỉnh táo, bạn sẽ sử dụng stty sanelệnh. Ngoại trừ việc này bây giờ là không thể, do đó có sttysẵn như STTYđã được chào đón. Tôi thậm chí không thể nhớ lần cuối cùng tôi cần điều này :)
Dennis Kaarsemaker

@DennisKaarsemaker: WOW! Đó là một phần tuyệt vời của lịch sử!
Emanuel Berg

1
Các bạn (ott-- và @DennisKaarsemaker), bạn có nó lạc hậu. Tôi đã đăng một câu trả lời khác để làm rõ.
Stéphane Chazelas

4

Một vài lưu ý về STTYmệnh lệnh lịch sử để làm rõ một số điểm không chính xác trong câu trả lời khác và các bình luận liên quan :

Các thiết bị đầu cuối trước đó như DEC VT05 hoặc VT50 và các máy in từ xa trước đó chỉ hỗ trợ các ký tự chữ hoa. Điều đó có nghĩa là không có ký tự chữ thường nào có thể được nhập từ chúng hoặc chúng sẽ không thể hiển thị bất kỳ chữ cái nào khác ngoài chữ in hoa.

Unix là trường hợp nhạy cảm và hầu hết các lệnh là chữ thường, bạn có thể thấy có vấn đề ở đó. Đó là lý do tại sao có các chế độ termio / termios đặc biệt (và vẫn còn đó trong các Unice hiện đại mặc dù các thiết bị đầu cuối đó đã qua lâu) để xử lý chúng.

termio / termios tương ứng là các giao diện cũ hơn và mới hơn để điều khiển trình điều khiển tty trên Unix. Trong một thuật ngữ ioctl, bạn chỉ định cờ đầu vào, đầu ra, cờ điều khiển ... chỉ định cách xử lý tín hiệu điện trên đường nối tiếp vào các ký tự đầu vào và đầu ra và hành vi bên trong của trình điều khiển ghi lại những thứ như echo, trình chỉnh sửa dòng ... Hầu hết các ứng dụng này áp dụng cho các thiết bị đầu cuối ảo như bảng điều khiển VGA hiện đại hoặc thiết bị đầu cuối giả.

Giao diện dòng lệnh termio(s)sttylệnh.

Để xử lý các thiết bị đầu cuối chữ hoa, có ba termio(s)cờ liên quan:

  • IUCLC(Chữ hoa viết thường thành chữ thường): các ký tự đến được chuyển thành chữ thường khi nhập. Điều đó có nghĩa là việc Agửi bởi thiết bị đầu cuối được coi là a a. Điều đó có nghĩa là với điều này, bây giờ tôi có thể gõ LStrên VT50 của mình và trình bao sẽ đọc lstừ đó /dev/ttyX. Bây giờ tôi cũng có thể chạy sttylệnh.
  • Bây giờ, với IUCLCmột mình và thiết bị đầu cuối echo, trong khi tôi nhập LS, trình điều khiển sẽ gửi lslại cho thiết bị đầu cuối (vì vậy tôi có thể thấy những gì tôi nhập) mà nó không thể hiển thị, vì vậy chúng tôi cũng cần OLCUC(Đầu ra chữ thường cho chữ hoa), đó là chúng ta cần chuyển đổi bất kỳ chữ in thường thành chữ hoa trước khi gửi đến thiết bị đầu cuối.
  • Bây giờ, chúng ta có thể vận hành Unix từ VT50, nhưng nếu chúng ta muốn nhập các ký tự chữ hoa thì sao? Đó là nơi cờ xcase cục bộ xuất hiện. Điều này cho phép (chỉ ở chế độ đầu vào chính tắc) gửi chữ hoa Abằng cách nhập \Avà trên đầu ra, chữ hoa Ađược hiển thị dưới dạng \A. (cái đó không được triển khai trên Linux)

Các sttylệnh có tương ứng iuclc, olcucxcasecác thiết lập và một bí danh cho cả ba: lcase. Cài đặt mặc định và những gì bạn nhận được sau khi stty sanelcasetắt.

Vì vậy, khi bạn đang sử dụng VT50, tất cả những gì bạn cần làm là chạy:

stty lcase

để có thể làm bất cứ điều gì. Nhưng chờ đã, làm thế nào để bạn làm điều đó khi bạn chỉ có thể gửi chữ hoa? Đó là nơi bạn cần một STTYlệnh làm bí danh sttyvà đó là lý do tại sao sttyhỗ trợ LCASEnhư một bí danh cho lcase.

Không có SANEbí danh nào như vậy bởi vì bạn không muốn làm gì stty sanekhi thiết bị đầu cuối của bạn là chữ hoa.

Nếu bạn chạy stty lcasehoặc stty olcucdo nhầm lẫn trên một thiết bị đầu cuối bình thường (thử trong xtermhoặc bất kỳ thiết bị đầu cuối hiện đại nào), đó là nơi bạn cần nhập stty saneđể trở lại bình thường. Nhưng bạn không cần một STTYlệnh cho điều đó. Nếu bạn nhập stty sane, bạn sẽ thấy tiếng STTY SANEvang trở lại, nhưng đó chỉ là văn bản được hiển thị (không phải lệnh đã nhập) sẽ được dịch, đó vẫn là stty sanelệnh sẽ được chạy.

Những iuclc, olcuc, xcasecờ thường được xác định bởi POSIX (và có lẽ đó là lý do tại sao nó được thực hiện trên Linux mặc dù tôi nghiêm túc nghi ngờ ai bao giờ kết nối bất kỳ của những thiết bị đầu cuối cũ sang một hệ thống Linux (trừ cho vui)), nhưng đã bị loại bỏ trong POSIX: 2001.


2

Trên Fedora 18 tại đây:

amuFormat.sh
chkrootkitX
enum_chmLib
enumdir_chmLib
extract_chmLib
fakeCMY
GET
HEAD
Mail
oLschema2ldif
POST
smoltDeleteProfile
smoltGui
smoltSendProfile
smp_conf_zone_man_pass.#prelink#.coLtYv
Terminal
test_chmLib
Thunar
X
Xephyr
xfig-Xaw3d
Xorg
Xvnc
MAKEDEV
NetworkManager
amuFormat.sh
chkrootkitX
enum_chmLib
enumdir_chmLib
extract_chmLib
fakeCMY
GET
HEAD
Mail
oLschema2ldif
POST
smoltDeleteProfile
smoltGui
smoltSendProfile
smp_conf_zone_man_pass.#prelink#.coLtYv
Terminal
test_chmLib
Thunar
X
Xephyr
xfig-Xaw3d
Xorg
Xvnc
MAKEDEV
NetworkManager

Tổng cộng có 50 (trong đó tôi không biết nhiều nhất).


1
50, nhưng 25 cái khác biệt.
Stéphane Chazelas

0

Trên sid Debian, với zsh, và ls -1 $path | grep '[A-Z]', tôi nhận được

GET
HEAD
HtFileType
Mail
POST
Pnews
Rnmail
X
X11
Xephyr
Xorg
ircII
amuFormat.sh
hpljP1005
hpljP1006
hpljP1007
hpljP1008
hpljP1505

Chỉnh sửa: Lưu ý rằng, trong lệnh trên, đó là chữ số một, không phải chữ cái l. Một cái như trong một cột.


1
Với zsh, chạy:type -m '*[A-Z]*'
Stéphane Chazelas

@StephaneChazelas: OK, của bạn sẽ hiển thị đường dẫn tìm kiếm và cũng bao gồm các hàm shell. Nhưng của tôi cũng là zsh cụ thể: chữ thường $pathkhông có trong bash, cho một lần. Vâng, càng nhiều thông tin, càng tốt.
Emanuel Berg

1
Vâng, tôi không nói bạn sai, chỉ đề xuất một cách thay thế (mặc dù tôi đồng ý rằng đó không phải là từ hay nhất). Lưu ý rằng $pathkhông phải là zsh cụ thể. Nó đến từ csh/tcshnơi lệnh của bạn cũng hoạt động.
Stéphane Chazelas

@StephaneChazelas: Aha, thật thú vị! Không, lệnh của tôi không "sai" nhưng tôi đồng ý rằng lệnh của bạn tốt hơn bởi vì nó bao gồm các hàm và bí danh. Ít nhất là đối với tôi, bởi vì khi tôi sử dụng máy tính của mình, tôi không quan tâm nếu đó là nhị phân, tập lệnh, hàm, bí danh hay bất cứ điều gì, miễn là tôi có thể chạy nó và nó thực hiện công việc của nó. (Tôi đoán -mlà dành cho "trận đấu".)
Emanuel Berg
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.