Bir Linux komutunun büyük harfleri olabilir mi?


17

Bir Linux komutunun büyük harfleri olabilir mi? Desteklendiğini biliyorum ama bunun bir "sorun" olup olmadığından veya "iyi bir şey değil" olarak değerlendirildiğinden emin olmak ister misiniz?


6
UNIX kuralı, komut adları için küçük harf kullanmaktır, ancak bunları istediğiniz gibi arayabilirsiniz.

1
Gerçekten de, UNIX komutlarınızı ne çağırdığınız umurunda değil. Çok fazla acıya ve acı çekmeye neden olur, ancak içlerinde boşluklar olan komutlara bile sahip olabilirsiniz: beklendiği gibi echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"üretir hello world. ( Tabii ki ~/binsizin içinizdedir $PATH).
derobert

Bu soruya ve belki de çok uzun öğreticime göz atın .
Emanuel Berg

Yanıtlar:


13

Unix'te komut adlarında herhangi bir kısıtlama yoktur. Herhangi bir dosya bir komut olabilir. Ve bir dosya adı, ASCII NUL veya ASCII dışında bir veya daha fazla karakterden (ancak bir sınıra kadar) herhangi bir dizi olabilir /. zshhatta işlev adı olarak herhangi bir dizeye sahip olabileceğiniz işlevler için bu sınırlamayı kaldırır.

Ancak birkaç not:

  • .veya ..;-) adlı bir komut dosyası oluşturmakta zorlanırsınız.
  • Zaten standart komutları veya kabuk yerleşikleri veya anahtar kelimeler (en yaygın kabuklardan en az benzeri ile alınır önlemek adları bash, zsh, tcshveya ksh). Bu bağlamda, büyük harfli karakterler genellikle standart komutlar tarafından kullanılmadıkları için yardımcı olabilirler.
  • ASCII karakterleriyle kısıtlamak daha iyidir. ASCII olmayan karakterler, orada bulunan çeşitli karakter kümelerinde aynı şekilde ifade edilmez
  • işteyken kendinizi harfler, rakamlar, tire, nokta ve alt çizgi ile sınırlayın. Başka bir şey, yasal süre bununla veya aracı (örneğin, o ya da bu problemi neden olabilir |, =, &ve diğerleri kullanırsanız, kabuklarda kaçan gerekecektir :, komut kişinin giriş kabuğu olarak kullanılamaz ... ). Hatta hariç isteyebilir .ve -kullanıcıların bir kabuk işlevi komutunuzla sarmak için izin vermek istediğiniz durumda, hangi birçok kabuklarda fonksiyon adlarında izin verilmez.
  • İlk karakteri bir harf yapın. Yine katı bir gereklilik değil. Ancak alt çizgi bazen özel şeyler için kullanılır ( zshtamamlama sistemlerinden başlayan işlevlerde olduğu gibi _) ve tüm basamaklı komutlar gibi şeylerde bir sorun olabilir cmd>output.log. Adı bir nokta ile başlayan dosyalar, lskabuk globbings ve birçok dosya yöneticisi tarafından gizlenecektir .

Sağ. Bu yüzden sanırım kaynar, bunu yapmak için iyi bir nedeniniz yoksa sıradan bir şey kullanmayın. İkinci noktanız bile, bu kabukları örtmek için büyük harf kullanmanın akıllı olduğunu düşünmüyorum - değişikliği tanımlamak için komutu adlandırmak daha iyi değil mi? Gibi zsh_with_some_funky_option(yerine ZSH)?
Emanuel Berg

Takma ad bir komut mu? Çünkü evet ise, yazarken çok kolay zaman geçirdim alias .="echo Hello".-) (Peki, sudo vim /bin/.daha zordu, ama ...)
Alois Mahdal

@AloisMahdal Bu yüzden komut dosyası dedim . zsh da izin verir .() echo Hello. Pdksh de öyle, ama .özel yerleşik orada öncelik kazanıyor.
Stéphane Chazelas

Hata! Benim
perişan

27

Evet yapabilir ve zaten birkaç tane var. Gibi /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

Yani bu Ubuntu 12.04'ün tamamında 758. Tam liste: https://gist.github.com/5264777


Hayır Xdialog? : o grepKabuğun yürütülmeden önce geçerli dizinde genişlemesini önlemek için parametresini belirtmelisiniz.
manatwork

Bu sisteme
kurmayın

2
grep' İn parametresini alıntılamakta ısrar etmek istiyorum : pastebin.com/Gak7x9rN (Evet, kendim düzenleyebilirim, ancak nedenini anlamanızı tercih ederim.)
manatwork

1
Peki, kabuğa da bağlı olabilir. Örneğimde taşınabilirlik için büyük harf kullandım, ancak bashana [A-Z]dizinimdeki " aslında " cdfhjmpqrt "e geçiyor. Bu yüzden duyarsızca durum.
manatwork

1
Bahsetmemek zshya da bash'ın failglobseçeneği. Ben şahsen tipik (benim geçici dosyaları isim ~) a, b, c... ve benim geçici dirs A, B, C...
Stéphane Chazelas

4

En ünlü komut, sttyaynı zamanda mevcuttu STTY. Terminali tekrar normal davranışa ayarlamak çok kullanışlıdır STTY SANE.


Ben /bin/sttybaşka bir şey ama. Cevabınızı biraz daha ayrıntılı olarak ele almak ister misiniz?
Emanuel Berg

2
Eski güzel günlerde, terminalinizin o kadar berbat olması mümkün ki, her şey büyük harfti. Yani yazın ave terminal görecekti A. Akıl sağlığını eski haline getirmek için, stty sanekomutu kullanırsınız . Bunun şimdi imkansız olması dışında, bu nedenle sttykullanılabilir olması STTYçok hoştu. Buna rağmen en son ihtiyacım olan zamanı bile hatırlayamıyorum :)
Dennis Kaarsemaker

@DennisKaarsemaker: VAY! Bu harika bir tarih parçası!
Emanuel Berg

1
Beyler (ott-- ve @DennisKaarsemaker), geri aldınız. Açıklığa kavuşturmak için başka bir cevap gönderdim .
Stéphane Chazelas

4

Tarih hakkında birkaç not STTYDiğer cevap ve ilgili yorumlardaki bazı yanlışlıkları açıklığa kavuşturmak komutla :

DEC VT05 gibi daha önceki terminaller veya VT50 ve bu yalnızca desteklenen büyük harf karakterden önce tele yazıcılar. Bunun anlamı, onlardan hiçbir küçük harf girilememesi veya büyük harflerden başka bir harf görüntüleyememesidir.

Unix büyük / küçük harfe duyarlıdır ve çoğu komut küçük harflidir, orada bir sorun olduğunu görebilirsiniz. Bu nedenle, bunları idare etmek için özel termio / termios modları vardır (ve bu terminaller çoktan gitmiş olsa bile hala modern Unices'te bulunmaktadır).

termio / termios, Unix'te tty sürücüsünü kontrol etmek için sırasıyla daha eski ve daha yeni arayüzlerdir. Bir terim (ler) deioctl , bir seri hattaki elektrik sinyallerinin giriş ve çıkış karakterlerine nasıl işleneceğini ve yankı gibi sürücünün dahili davranışını belirten giriş, çıkış, kontrol bayrakları ... hat editörü ... Bunların çoğu modern Unix VGA konsolları veya sözde terminaller gibi sanal terminaller için geçerlidir.

Komut hattı arabirimi termio(s)olanstty komut.

Büyük harfli terminalleri işlemek için üç termio(s)bayrak bulunur:

  • IUCLC(Büyük Harf Küçük Harfe Gir): Gelen karakterler girdiğinde küçük harfe dönüştürülür. Bu Aterminal tarafından gönderilen bir olarak kabul edilir anlamına gelir a. Bu, bununla birlikte, şimdi LSVT50'ime yazabileceğim ve kabuğun okuyacağı anlamına lsgeliyor /dev/ttyX. Şimdi sttykomutu da çalıştırabilirim .
  • Şimdi, IUCLCtek başına ve terminal ile echo, ben yazarken LS, sürücü lsgösteremediği terminale (ne yazdığımı görebiliyorum) geri gönderecek , bu yüzden de ihtiyacımız varOLCUC (Küçük Harfe Büyük Harfe Çıkar), yani terminale göndermeden önce küçük harfleri büyük harfe dönüştürmeliyiz.
  • Şimdi Unix'i bir VT50'den çalıştırabiliriz, ama şimdi büyük harfli karakterler girmek istiyorsak? Bu, xcase yerel bayrağın devreye girdiği yerdir . Bu, (yalnızca standart giriş modunda) Ayazarak bir büyük harf gönderilmesine izin verir \Ave çıktıda bir büyük harf Aolarak oluşturulur \A. (Linux'ta uygulanmayan)

sttyKomut tekabül vardır iuclc, olcucve xcaseayarları ve üçü için bir takma ad: lcase. Peşinde olsun varsayılan ayar ve hangi stty saneolduğulcase kapalı.

Yani, bir VT50'deyken, yapmanız gereken tek şey çalıştırmak:

stty lcase

her şeyi yapabilmek. Ama bekleyin, bunu sadece büyük harf gönderebildiğinizde nasıl yaparsınız? Burası STTYiçin takma ad olarak bir komuta ihtiyacınız sttyvar ve bu yüzden takma ad olarak sttydestekleniyor .LCASElcase

Böyle bir SANEtakma ad yoktur, çünkü stty saneterminaliniz büyük harf olduğunda yapmak istemezsiniz .

Normal bir terminalde (yanlışlıkla veya herhangi bir modern terminalde) çalıştırıyorsanız stty lcaseveya stty olcucyanlışlıkla çalıştırıyorsanız , normale dönmek için xtermgirmeniz gereken yer burasıdır stty sane. Ama bunun için bir STTYkomuta ihtiyacınız yok . Yazdığınızda stty sane, yankılanmış görürsünüz , ancak bu yalnızca çevrilecekSTTY SANE olan görüntülenen metindir (girilen komut değil), yine stty sanede çalıştırılacak komuttur.

Bunlar iuclc, olcuc, xcasebayraklar POSIX tarafından belirtilmesi için kullanılan (ve Linux üzerinde uygulanan neden ciddiye Aranızda hiç) eğlence için daha (başka bir Linux sistemine o eski terminal herhangi bağlanan şüphe dahi bu muhtemelen), ancak kaldırılmıştır POSIX: 2001.


2

Fedora 18'de:

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

Toplam 50 (en çok bilmiyordum).


1
50, ancak 25 farklı.
Stéphane Chazelas

0

Debian zsh ile sid ve ls -1 $path | grep '[A-Z]'ben olsun,

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

Düzenleme: Yukarıdaki komutta, harf değil, bir rakam olduğunu unutmayın l. Bir sütundaki gibi.


1
İle zsh, çalıştırın:type -m '*[A-Z]*'
Stéphane Chazelas

@StephaneChazelas: Tamam, sizinki arama yolunu görüntüler ve kabuk işlevlerini de içerir. Ama benimki de zsh'a özgü: küçük harf bir $pathkez bash'da değil. Daha fazla bilgi, daha iyi.
Emanuel Berg

1
Evet, seninkinin yanlış olduğunu söylemedim, sadece bir alternatif önerdi (ancak ifadelerin en iyisi olmadığını kabul ediyorum). $pathZsh'ye özgü olmadığını unutmayın . csh/tcshKomutunuzun da çalıştığı yerden geliyor .
Stéphane Chazelas

@StephaneChazelas: Aha, bu ilginç! Hayır, benim komutum "yanlış" değil ama seninkinin daha iyi olduğunu kabul ediyorum çünkü kabuk fonksiyonlarını ve takma adlarını dahil etmek mantıklı. En azından benim için öyle, çünkü bilgisayarımı kullandığımda, çalıştırabildiğim ve işini yaptığı sürece, ikili, komut dosyası, işlev, takma ad veya başka bir şey olup olmadığı umurumda değil. (Sanırım -m"maç" için.)
Emanuel Berg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.