क्या लिनक्स कमांड में कैपिटल लेटर हो सकता है?


17

क्या लिनक्स कमांड में कैपिटल लेटर हो सकता है? मुझे पता है कि यह समर्थित है लेकिन मुझे यकीन है कि अगर यह "समस्या" है या "अच्छी बात नहीं" माना जाता है?


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

जवाबों:


13

यूनिक्स पर कमांड नामों पर कोई प्रतिबंध नहीं है। कोई भी फाइल एक कमांड हो सकती है। और फ़ाइल नाम ASCII NUL या CCII के अलावा अन्य वर्णों के एक या अधिक (एक सीमा तक) का कोई भी अनुक्रम हो सकता है /zshयहां तक ​​कि उन कार्यों के लिए सीमा भी है जहां आपको फ़ंक्शन नाम के रूप में कोई भी स्ट्रिंग हो सकती है।

कुछ नोट हालांकि:

  • आपके पास एक कठिन समय होगा; .या ..;-) नामक एक कमांड फ़ाइल का निर्माण ।
  • से बचने के ऐसे नाम हैं जो पहले से ही मानक आज्ञा या खोल builtins या कीवर्ड (सबसे सामान्य गोले के कम से कम तरह से लिया जाता है bash, zsh, tcshया ksh)। इस संबंध में ऊपरी मामले के पात्र मदद कर सकते हैं क्योंकि वे आमतौर पर मानक आदेशों द्वारा उपयोग नहीं किए जाते हैं।
  • एएससीआईआई के पात्रों को प्रतिबंधित करना बेहतर है। गैर ASCII वर्ण विभिन्न वर्ण सेटों में समान नहीं हैं, जो वहां हैं
  • जब आप इस पर हों, तो अपने आप को अक्षरों, अंकों, डैश, डॉट और अंडरस्कोर तक सीमित रखें। और कुछ है, जबकि कानूनी, इस के साथ या उपकरण (उदाहरण के लिए, कि एक समस्या है या किसी अन्य कारण हो सकता है |, =, &और कई अन्य लोगों, गोले में भाग निकले जा करने के लिए करता है, तो आप का उपयोग की आवश्यकता होगी :, अपने आदेश एक के लॉगिन शेल के रूप में इस्तेमाल नहीं किया जा सकता है ... )। यदि आप उपयोगकर्ताओं को किसी शेल फ़ंक्शन में आपकी कमांड को लपेटने की अनुमति देना चाहते हैं, तो आप कई नामों को छोड़ना नहीं चाह सकते हैं .और -कई शेल में फ़ंक्शन नामों की अनुमति नहीं है।
  • पहले पात्र को एक अक्षर बनाओ। फिर, सख्त आवश्यकता नहीं। लेकिन कभी-कभी अंडरस्कोर का उपयोग विशेष चीजों के लिए किया जाता है (जैसे zshकि पूरा सिस्टम शुरू होने वाले कार्यों से _), और ऑल-डिजिट कमांड जैसी चीजों में समस्या हो सकती है cmd>output.log। जिन फाइलों का नाम डॉट से शुरू होता है, उन्हें lsशेल ग्लोबिंग और कई फाइल मैनेजर जैसी चीजों से छिपाया जाएगा ।

सही। इसलिए मुझे लगता है कि यह उबलता है, जब तक आपके पास ऐसा करने का एक अच्छा कारण नहीं है, तब तक कुछ भी सामान्य से बाहर का उपयोग न करें। यहां तक ​​कि आपके दूसरे बिंदु, मुझे नहीं लगता कि उन गोले को कवर करने के लिए अपरकेस का उपयोग करना स्मार्ट है - क्या बदलाव का वर्णन करने के लिए कमांड का नाम देना बेहतर नहीं है? जैसे, zsh_with_some_funky_option(के बजाय ZSH)?
इमानुएल बर्ग

क्या उपनाम एक आज्ञा है? क्योंकि यदि हां, तो मेरे पास बहुत आसान समय टाइपिंग है। alias .="echo Hello") (), ( sudo vim /bin/.हालांकि, कठिन था, हालांकि ...)
एलोइस महदाल

@AloisMahdal इसीलिए मैंने कमांड फाइल कहा । zsh भी अनुमति देता है .() echo Hello। तो pdksh करता है, लेकिन .विशेष अंतर्निहित वहाँ पूर्वता लेता है।
स्टीफन चेज़लस

उफ़, मेरी गलतफहमी ... पीडीएस के पूर्व के प्रसंगों के बारे में दिलचस्प बात, हालाँकि ...
अलोइस महदाल

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

तो उबंटू 12.04 के सभी में यह 758 है। पूरी सूची: https://gist.github.com/5264777


नहीं Xdialog? : ओ और आपको grepनिष्पादन से पहले वर्तमान निर्देशिका में इसे विस्तारित करने वाले शेल से बचने के लिए पैरामीटर को उद्धृत करना चाहिए ।
मैनेटवर्क

इसे इस सिस्टम पर स्थापित न करें :)
डेनिस कार्सेमेकर

2
मैं grep's पैरामीटर: pastebin.com/Gak7x9rN (हां, मैं इसे स्वयं संपादित कर सकता हूं, उद्धृत करने पर जोर देना चाहूंगा , लेकिन मैं समझता हूं कि आप इसे क्यों पसंद करते हैं।)
मैनटवर्क

1
खैर, यह शेल पर भी निर्भर हो सकता है। मैंने पोर्टेबिलिटी के लिए अपने उदाहरण में अपरकेस का इस्तेमाल किया, लेकिन bashमेरी होम डाइरेक्टरी में मेरा वास्तव [A-Z]में "cdfhjmpqrt" का विस्तार है। इसलिए असंवेदनशील मामला।
मैनेटवर्क

1
उल्लेख zshया बैश का failglobविकल्प नहीं। मैं व्यक्तिगत रूप से आम तौर पर मेरी अस्थायी फ़ाइलों का नाम (में ~) a, b, c... और मेरी अस्थायी dirs A, B, C...
स्टीफन Chazelas

4

सबसे प्रसिद्ध कमांड है stty, जो के रूप में भी उपलब्ध था STTY। टर्मिनल को सामान्य व्यवहार के साथ वापस सेट करना बहुत आसान था STTY SANE


मेरे पास /bin/sttyऔर कुछ नहीं है। अपने उत्तर को थोड़ा विस्तृत करने के लिए देखभाल करें?
इमानुएल बर्ग

2
अच्छे पुराने दिनों में, आपके टर्मिनल के लिए इतना खराब हो जाना संभव था, कि सब कुछ ऊपर-नीचे हो गया था। तो टाइप करें aऔर टर्मिनल देखें A। पवित्रता बहाल करने के लिए, आप stty saneकमांड का उपयोग करेंगे । सिवाय इसके कि यह अब असंभव है, इसलिए sttyउपलब्ध होने STTYका बहुत स्वागत था। मुझे पिछली बार भी याद नहीं आया कि मुझे इसकी आवश्यकता थी हालांकि :)
डेनिस करसेमेकर

@DennisKaarsemaker: वाह! यह इतिहास का कुछ ठंडा टुकड़ा है!
इमानुएल बर्ग

1
दोस्तों (ott-- और @DennisKaarsemaker), आपके पास यह पिछड़ा हुआ है। मैंने स्पष्टीकरण के लिए एक और उत्तर पोस्ट किया है ।
स्टीफन चेज़लस 22

4

ऐतिहासिक STTYआदेश पर कुछ नोट्स अन्य उत्तर और संबंधित टिप्पणियों में कुछ अशुद्धियों को स्पष्ट करने के लिए :

इससे पहले DEC VT05 या VT50 और इससे पहले के टेलीप्रिंटर्स जैसे टर्मिनलों ने केवल ऊपरी मामले वर्णों का समर्थन किया था। इसका मतलब यह है कि कोई भी निचला मामला चरित्र उनसे इनपुट नहीं हो सकता है या वे ऊपरी मामले की तुलना में किसी अन्य पत्र को प्रदर्शित करने में सक्षम नहीं होंगे।

यूनिक्स केस संवेदनशील होने और अधिकांश कमांड लोअर केस होने के कारण, आप देख सकते हैं कि वहाँ एक मुद्दा है। यही कारण है कि उन लोगों को संभालने के लिए विशेष टर्मियो / टर्मिनस मोड्स हैं (और अभी भी आधुनिक यूनीसेज़ में हैं।

termio / termios क्रमशः पुराने और नए इंटरफेस हैं, जो यूनिक्स पर ट्टी ड्राइवर को नियंत्रित करने के लिए हैं। एक शब्दावली मेंioctl , आप इनपुट, आउटपुट, कंट्रोल फ्लैग को निर्दिष्ट करते हैं ... यह निर्दिष्ट करते हैं कि एक सीरियल लाइन पर इलेक्ट्रिक सिग्नल को इनपुट और आउटपुट कैरेक्टर में कैसे संभाला जाना है और ड्राइवर के आंतरिक व्यवहार जैसे कि इको, लाइन एडिटर ... उनमें से अधिकांश आधुनिक यूनिक्स वीजीए कंसोल या छद्म टर्मिनलों जैसे आभासी टर्मिनलों पर लागू होते हैं।

कमांड लाइन इंटरफ़ेस termio(s)हैstty आदेश।

ऊपरी-मामले टर्मिनलों को संभालने के लिए, तीन termio(s)झंडे शामिल हैं:

  • IUCLC(इनपुट अपर केस टू लोअर केस): इनपुट के समय आने वाले वर्ण निचले मामले में परिवर्तित हो जाते हैं। इसका मतलब Aहै कि टर्मिनल द्वारा भेजा गया एक माना जाता है a। इसका मतलब है कि यह है कि इस पर साथ, मैं अब टाइप कर सकते हैं LSमेरी VT50 पर, और खोल पढ़ा जाएगा lsसे /dev/ttyX। मैं अब sttyकमांड भी चला सकता हूं ।
  • अब, IUCLCअकेले और टर्मिनल के साथ echo, जबकि मैं टाइप करता हूं LS, तो चालक lsटर्मिनल पर वापस भेज देगा (इसलिए मैं देख सकता हूं कि मैं क्या टाइप करता हूं) जिसे वह प्रदर्शित नहीं कर सकता है, इसलिए हमें भी आवश्यकता हैOLCUC (आउटपुट लोअर केस टू अपर केस) की आवश्यकता है, हमें टर्मिनल पर भेजने से पहले किसी भी निचले मामले के पत्र को अपरकेस में बदलने की आवश्यकता है।
  • अब, हम यूनिक्स को VT50 से संचालित कर सकते हैं, लेकिन क्या होगा अगर हम ऊपरी केस के पात्रों को इनपुट करना चाहते हैं? यही कारण है कि xcase स्थानीय ध्वज अंदर आता है। यह अनुमति देता है (केवल विहित इनपुट मोड में) Aटाइप करके एक ऊपरी मामला भेज रहा है \A, और आउटपुट पर, एक ऊपरी मामले के Aरूप में प्रस्तुत किया गया है \A। (यह एक लिनक्स पर लागू नहीं है)

sttyआदेश इसी है iuclc, olcucऔर xcase: सेटिंग्स और सभी तीन के लिए उपनाम lcase। डिफ़ॉल्ट सेटिंग और उसके बाद आपको क्या मिलता stty saneहै lcase

इसलिए, जब आप वीटी 50 पर होते हैं, तो आपको बस इतना करना होता है:

stty lcase

कुछ भी करने में सक्षम होने के लिए। लेकिन पकड़ो, तुम कैसे करते हो जब तुम केवल बड़े अक्षर भेज सकते हो? यहीं आपको STTYएक उपनाम के रूप में एक कमांड की आवश्यकता होती है stty, और यही कारण sttyहै LCASEकि इसके लिए एक उपनाम के रूप में समर्थन करता हैlcase

ऐसा कोई 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

फेडोरा 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 अलग हैं।
स्टीफन चेज़लस

0

डेबियन किनारे पर, ज़ीश के साथ, और 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]*'
स्टीफन चेजालस 29:13

@StephaneChazelas: ठीक है, आपका खोज पथ प्रदर्शित करता है, और इसमें शैल फ़ंक्शन भी शामिल हैं। लेकिन मेरा भी zsh विशिष्ट है: लोअरकेस $pathएक बार के लिए बैश में नहीं है। खैर, अधिक जानकारी, बेहतर है।
इमानुएल बर्ग

1
हां, मैंने ऐसा नहीं कहा था कि आप गलत थे, बस एक विकल्प सुझाया (हालांकि मैं मानूंगा कि यह सबसे अच्छा शब्द नहीं है)। ध्यान दें कि $pathzsh विशिष्ट नहीं है। यह csh/tcshवहीं से आता है जहां आपकी कमांड भी काम करती है।
स्टीफन चेज़लस

@ स्टेफ़ेनचेज़लस: अहा, यह दिलचस्प है! नहीं, मेरा आदेश "गलत" नहीं है, लेकिन मैं मानता हूं कि आपका बेहतर है क्योंकि यह शेल फ़ंक्शन और उपनाम शामिल करने के लिए समझ में आता है। कम से कम मेरे लिए यह करता है, क्योंकि जब मैं अपने कंप्यूटर का उपयोग करता हूं, तो मुझे परवाह नहीं है कि यह एक बाइनरी, एक स्क्रिप्ट, एक फ़ंक्शन, एक उपनाम, या जो कुछ भी है, जब तक मैं इसे चला सकता हूं और यह अपना काम करता है। (मुझे लगता है कि -m"मैच" के लिए है।)
इमानुएल बर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.