คำสั่ง Linux สามารถมีอักษรตัวใหญ่ได้หรือไม่


17

คำสั่ง Linux สามารถมีอักษรตัวใหญ่ได้หรือไม่ ฉันรู้ว่ามันรองรับ แต่ฉันต้องการแน่ใจว่ามันเป็น "ปัญหา" หรือพิจารณาว่า "ไม่ใช่สิ่งที่ดี"?


6
การประชุม UNIX คือการใช้ตัวพิมพ์เล็กสำหรับชื่อคำสั่ง แต่คุณสามารถโทรหาพวกเขาได้ตามที่คุณต้องการ

1
แน่นอน UNIX ไม่สนใจสิ่งที่คุณเรียกคำสั่งของคุณ มันจะทำให้เกิดความเจ็บปวดและความทุกข์ทรมานมากมาย แต่คุณสามารถมีคำสั่งที่มีช่องว่างในพวกเขา: echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"สร้างhello worldตามที่คาด (สมมติว่า~/binเป็นของคุณ$PATHแน่นอน)
Derobert

ตรวจสอบนี้คำถามและบางทีอาจจะนานเกินไปฉันกวดวิชา
Emanuel Berg

คำตอบ:


13

ไม่มีข้อ จำกัด เกี่ยวกับชื่อคำสั่งใน Unix ไฟล์ใดก็ได้สามารถเป็นคำสั่ง และชื่อไฟล์ที่สามารถเป็นลำดับหนึ่งหรือมากกว่าใด ๆ (ไม่เกินวงเงินแม้ว่า) ของตัวละครอื่นที่ไม่ใช่ ASCII หรือ NUL /ASCII zshแม้แต่ยกข้อ จำกัด นั้นสำหรับฟังก์ชั่นที่คุณสามารถมีสตริงใด ๆ เป็นชื่อฟังก์ชั่น

หมายเหตุเล็กน้อยที่:

  • คุณจะมีปัญหาในการสร้างไฟล์คำสั่งชื่อ.or ..;-)
  • ชื่อหลีกเลี่ยงการที่มีการดำเนินการแล้วโดยคำสั่งมาตรฐานหรือ builtins เปลือกหรือคำสำคัญ (อย่างน้อยของเปลือกหอยที่พบมากที่สุดเช่นbash, zsh, tcshหรือksh) ในกรณีที่เกี่ยวกับตัวอักษรตัวใหญ่สามารถช่วยในขณะที่พวกเขามักจะไม่ใช้คำสั่งมาตรฐาน
  • เป็นการดีกว่าที่จะ จำกัด อักขระ ASCII อักขระที่ไม่ใช่ ASCII จะไม่แสดงเหมือนกันในชุดอักขระต่างๆที่อยู่ข้างนอก
  • ในขณะที่คุณอยู่ที่นี่ให้ จำกัด ตัวคุณไว้ที่ตัวอักษรตัวเลขเส้นประจุดและขีดล่าง สิ่งอื่นใดในขณะที่กฎหมายอาจก่อให้เกิดปัญหาหรืออื่นนี้หรือว่าเครื่องมือ (เช่น|, =, &และอื่น ๆ อีกมากมายที่จะต้องหนีออกมาในเปลือกหอยถ้าคุณใช้:คำสั่งของคุณไม่สามารถใช้เป็นเปลือกเข้าสู่ระบบหนึ่งของ ... ) คุณอาจต้องการแยก.และ-ไม่อนุญาตให้ใช้ในชื่อฟังก์ชันในเชลล์จำนวนมากในกรณีที่คุณต้องการอนุญาตให้ผู้ใช้ห่อคำสั่งของคุณในฟังก์ชันเชลล์
  • ทำให้ตัวอักษรตัวแรกเป็นตัวอักษร อีกครั้งไม่ใช่ข้อกำหนดที่เข้มงวด แต่ขีดบางครั้งใช้สำหรับสิ่งพิเศษ (เหมือนในzshฟังก์ชั่นเสร็จจากระบบเริ่มต้นด้วย_) cmd>output.logและคำสั่งทั้งหมดหลักอาจจะมีปัญหาในสิ่งที่ต้องการ ไฟล์ที่ชื่อขึ้นต้นด้วยจุดจะถูกซ่อนไว้โดยสิ่งต่าง ๆ เช่นlsหรือเชลล์ globbings และตัวจัดการไฟล์จำนวนมาก

ขวา. ดังนั้นฉันเดาว่ามันจะเดือดร้อนอย่าใช้อะไรที่ไม่ธรรมดาเว้นแต่คุณจะมีเหตุผลที่ดีที่จะทำเช่นนั้น แม้แต่ประเด็นที่สองของคุณฉันไม่คิดว่าการใช้ตัวพิมพ์ใหญ่เพื่อปกปิดเชลล์เหล่านั้นเป็นสิ่งที่ฉลาด - ไม่ควรตั้งชื่อคำสั่งเพื่ออธิบายการเปลี่ยนแปลงหรือไม่ กดไลค์zsh_with_some_funky_option(แทนZSH)
Emanuel Berg

นามแฝงเป็นคำสั่งหรือไม่? เพราะถ้าใช่ฉันพิมพ์เวลาได้ง่ายมากalias .="echo Hello"-) ( sudo vim /bin/.ก็ยากขึ้น ... )
Alois Mahdal

@AloisMahdal นั่นเป็นเหตุผลที่ผมกล่าวว่าคำสั่งไฟล์ zsh .() echo Helloยังช่วยให้ pdksh ก็เช่นกัน แต่บิวด์อิน.พิเศษนั้นสำคัญกว่า
Stéphane Chazelas

โอ๊ะฉันเข้าใจผิด ... จุดที่น่าสนใจเกี่ยวกับลำดับความสำคัญ pdksh แม้ว่า ...
Alois Mahdal

27

ใช่มันสามารถทำได้และมีบางอย่างอยู่แล้ว เช่น/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

นั่นคือ 758 ใน Ubuntu 12.04 ทั้งหมด รายการทั้งหมด: https://gist.github.com/5264777


ไม่มีXdialog? : o และคุณควรอ้างอิงgrepพารามิเตอร์ของเชลล์เพื่อหลีกเลี่ยงการขยายเชลล์ในไดเรกทอรีปัจจุบันก่อนที่จะดำเนินการ
จัดการ

ไม่ได้ติดตั้งในระบบนี้ :)
เดนนิส Kaarsemaker

2
ฉันต้องการยืนยันเกี่ยวกับการอ้างอิงgrepพารามิเตอร์ของ: pastebin.com/Gak7x9rN (ใช่ฉันสามารถแก้ไขได้ด้วยตัวเอง แต่ฉันต้องการให้คุณเข้าใจว่าทำไม)
manatwork

1
ก็อาจขึ้นอยู่กับเชลล์ด้วย ฉันใช้ตัวพิมพ์ใหญ่ในตัวอย่างเพื่อความสะดวกในการพกพา แต่bashจริง ๆ แล้วในไดเรกทอรีบ้านของฉันได้[A-Z]กลายเป็น“ cdfhjmpqrt” ดังนั้นกรณีตาย ๆ
จัดการ

1
ไม่พูดถึงzshหรือfailglobตัวเลือกของทุบตี ผมเองมักจะตั้งชื่อไฟล์ temp ของฉัน (ใน~) a, b, c... และฉัน dirs อุณหภูมิA, B, C...
Stéphane Chazelas

4

คำสั่งที่โด่งดังที่สุดก็คือsttyซึ่งก็มีให้เช่นSTTYกัน STTY SANEมันเป็นประโยชน์มากในการตั้งสถานีกลับไปที่พฤติกรรมปกติด้วย


ฉันมี/bin/sttyแต่ไม่มีอะไรอื่น สนใจที่จะตอบคำถามของคุณให้ละเอียดหรือไม่?
Emanuel Berg

2
ในสมัยก่อนเป็นไปได้ที่เทอร์มินัลของคุณจะเมาจนทุกอย่างเป็นตัวพิมพ์ใหญ่ ดังนั้นพิมพ์aและ terminal Aจะเห็น หากต้องการคืนสติคุณจะต้องใช้stty saneคำสั่ง ยกเว้นว่าตอนนี้เป็นไปไม่ได้ดังนั้นจึงมีsttyให้ใช้เพราะSTTYยินดีมาก ฉันไม่สามารถแม้แต่จะจำครั้งสุดท้ายที่ฉันต้องการ แต่นี่ :)
เดนนิส Kaarsemaker

@DennisKaarsemaker: ว้าว! นั่นเป็นประวัติศาสตร์ที่เยี่ยมยอด!
Emanuel Berg

1
Guys (ott-- และ @DennisKaarsemaker) คุณมีแบบย้อนกลับ ฉันโพสต์คำตอบอื่นเพื่อชี้แจง
Stéphane Chazelas

4

หมายเหตุบางประการเกี่ยวกับSTTYคำสั่งประวัติเพื่อชี้แจงความไม่ถูกต้องบางอย่างในคำตอบอื่น ๆ และความคิดเห็นที่เกี่ยวข้อง :

เทอร์มินัลก่อนหน้านี้เช่นDEC VT05หรือVT50และเครื่องเคลื่อนย้ายมวลสารก่อนหน้านั้นรองรับเฉพาะอักขระตัวพิมพ์ใหญ่เท่านั้น สิ่งที่หมายถึงคือไม่มีอักขระตัวพิมพ์เล็กที่ไม่สามารถป้อนจากพวกเขาหรือว่าพวกเขาจะไม่สามารถแสดงตัวอักษรอื่น ๆ กว่าตัวอักษรตัวพิมพ์ใหญ่

Unix เป็นแบบตัวพิมพ์เล็กและคำสั่งส่วนใหญ่จะเป็นตัวพิมพ์เล็กคุณจะเห็นว่ามีปัญหาอยู่ที่นั่น นั่นเป็นเหตุผลที่มีโหมด termio / termios พิเศษ (และยังคงมีอยู่ใน Unices ที่ทันสมัยแม้ว่าเทอร์มินัลเหล่านั้นจะหายไปนาน) เพื่อจัดการกับเหล่านั้น

termio / termios เป็นอินเทอร์เฟซรุ่นเก่าและใหม่กว่าเพื่อควบคุมไดรเวอร์ tty บน Unix ใน termio ioctlคุณระบุอินพุตเอาต์พุตเอาต์พุตควบคุมแฟล็ก ... ที่ระบุวิธีจัดการสัญญาณไฟฟ้าบนบรรทัดอนุกรมในการจัดการกับอักขระอินพุตและเอาต์พุตและลักษณะการทำงานภายในของไดรเวอร์ wrt เช่น echo ตัวแก้ไขเส้น ... ส่วนใหญ่ใช้กับเทอร์มินัลเสมือนเช่นคอนโซล Unix VGA สมัยใหม่หรือเทอร์มินัลหลอก

อินเตอร์เฟสบรรทัดคำสั่งที่termio(s)เป็นsttyคำสั่ง

เพื่อจัดการกับเทอร์มินัลตัวพิมพ์ใหญ่มีสามtermio(s)แฟลกที่เกี่ยวข้อง:

  • IUCLC(ป้อนตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก): อักขระที่เข้ามาจะถูกแปลงเป็นตัวพิมพ์เล็กเมื่อป้อนข้อมูล นั่นหมายถึงการส่งโดยสถานีถือเป็นA aนั่นหมายความว่ามีเกี่ยวกับเรื่องนี้ตอนนี้ผมสามารถพิมพ์LSบน VT50 ของฉันและเปลือกจะอ่านจากls /dev/ttyXตอนนี้ฉันยังสามารถรันsttyคำสั่งได้
  • ขณะนี้ด้วยIUCLCคนเดียวและเทอร์มินัลechoในขณะที่ฉันพิมพ์LSคนขับจะส่งlsกลับไปที่เทอร์มินัล (เพื่อให้ฉันเห็นสิ่งที่ฉันพิมพ์) ซึ่งไม่สามารถแสดงได้ดังนั้นเราจึงต้องการOLCUC(Output Lower Case to Upper Case) นั่นคือ เราจำเป็นต้องแปลงอักษรตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่ก่อนที่จะส่งไปยังเทอร์มินัล
  • ตอนนี้เราสามารถใช้งาน Unix ได้จาก VT50 แต่ถ้าหากเราต้องการใส่ตัวอักษรตัวพิมพ์ใหญ่ตอนนี้ล่ะ? นั่นคือสิ่งที่xcase ท้องถิ่นธงมาใน. นี้จะช่วยให้ (ในโหมดการป้อนข้อมูลที่ยอมรับเท่านั้น) ส่งกรณีบนAโดยการพิมพ์\Aและการส่งออกเป็นกรณีบนจะกลายเป็นA \A(อันนั้นไม่ได้ดำเนินการบน Linux)

sttyคำสั่งมีความสอดคล้องกันiuclc, olcucและการตั้งค่าและนามแฝงสำหรับทั้งสาม:xcase lcaseตั้งค่าเริ่มต้นและสิ่งที่คุณได้รับหลังจากที่stty saneเป็นlcaseปิด

ดังนั้นเมื่อคุณใช้ VT50 สิ่งที่คุณต้องทำก็คือรัน:

stty lcase

เพื่อให้สามารถทำอะไรได้ แต่อย่าลืมว่าคุณจะทำอย่างนั้นได้อย่างไรเมื่อคุณสามารถส่งจดหมายตัวพิมพ์ใหญ่ได้เท่านั้น? นั่นคือสิ่งที่คุณจำเป็นต้องมีSTTYคำสั่งเป็นชื่อแทนสำหรับsttyและที่ว่าทำไมsttyการสนับสนุนเป็นชื่อแทนสำหรับLCASElcase

ไม่มีSANEนามแฝงดังกล่าวเนื่องจากคุณไม่ต้องการทำstty saneเมื่อเทอร์มินัลของคุณเป็นตัวพิมพ์ใหญ่ทั้งหมด

หากคุณเรียกใช้stty lcaseหรือstty olcucโดยไม่ตั้งใจในสถานีปกติ (ลองในxtermหรือสถานีที่ทันสมัย) นั่นคือสิ่งที่คุณต้องป้อนstty saneเพื่อกลับสู่ปกติ แต่คุณไม่ต้องการSTTYคำสั่งสำหรับสิ่งนั้น หากคุณพิมพ์stty saneคุณจะเห็นSTTY SANEเสียงสะท้อนกลับ แต่นั่นเป็นเพียงข้อความที่แสดง (ไม่ใช่คำสั่งที่ป้อน) ที่จะถูกแปลมันยังคงเป็นstty saneคำสั่งที่จะถูกเรียกใช้

บรรดาiuclc, olcuc, xcaseธงที่ใช้ในการระบุโดย POSIX (และอาจเป็นเหตุผลที่จะดำเนินการบน Linux แม้ว่าฉันจริงจังสงสัยใครเคยเชื่อมต่อใด ๆ ของอาคารเก่าที่เป็นระบบลินุกซ์ (นอกเหนือจากความสนุกสนาน)) แต่ได้ถูกลบออกใน POSIX: 2001


2

ใน Fedora 18 ที่นี่:

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

รวมเป็น 50 (ซึ่งฉันไม่รู้มากที่สุด)


1
50 แต่ 25 อันแตกต่าง
Stéphane Chazelas

0

บน Debian sid ด้วย zsh และls -1 $path | grep '[A-Z]'ฉันได้รับ

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

แก้ไข:lหมายเหตุว่าในคำสั่งดังกล่าวข้างต้นว่าเป็นหนึ่งในหลักไม่ได้ตัวอักษร หนึ่งในหนึ่งคอลัมน์


1
ด้วยzsh, วิ่ง:type -m '*[A-Z]*'
Stéphane Chazelas

@StephaneChazelas: ตกลงคุณแสดงเส้นทางการค้นหาและรวมถึงฟังก์ชั่นเชลล์ แต่ของฉันก็เฉพาะ zsh: ตัวพิมพ์เล็ก$pathไม่ได้อยู่ในทุบตีเป็นครั้งเดียว ยิ่งข้อมูลมากเท่าไหร่ก็ยิ่งดีเท่านั้น
Emanuel Berg

1
ใช่ฉันไม่ได้บอกว่าคุณคิดผิดแนะนำแค่ทางเลือกอื่น (แม้ว่าฉันจะเห็นด้วยว่ามันไม่ใช่คำพูดที่ดีที่สุด) โปรดทราบว่า$pathไม่เฉพาะ zsh มันมาจากcsh/tcshที่ที่คำสั่งของคุณใช้งานได้
Stéphane Chazelas

@StephaneChazelas: อ้านั่นน่าสนใจมาก! ไม่คำสั่งของฉันไม่ใช่ "ผิด" แต่ฉันเห็นด้วยกับคุณดีกว่าเพราะมันสมเหตุสมผลที่จะรวมฟังก์ชั่นของเชลล์และชื่อแทน อย่างน้อยสำหรับฉันก็ทำเพราะเมื่อฉันใช้คอมพิวเตอร์ของฉันฉันไม่สนใจว่ามันเป็นไบนารี, สคริปต์, ฟังก์ชั่น, นามแฝงหรืออะไรก็ตามตราบใดที่ฉันสามารถเรียกใช้และทำงานของมัน (ฉันเดาว่า-mสำหรับ "การจับคู่")
Emanuel Berg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.