Czy polecenie Linux może zawierać wielką literę (litery)?

17

Czy polecenie Linux może zawierać wielką literę (litery)? Wiem, że jest obsługiwany, ale chcę się upewnić, czy jest to „problem”, czy uważany za „coś niedobrego”?

terdon
źródło
6
Konwencja UNIX polega na używaniu małych nazw w nazwach poleceń, ale możesz je nazywać dowolnie.
1
Rzeczywiście, UNIX nie dba o to, co nazywasz swoimi poleceniami. Spowoduje to wiele bólu i cierpienia, ale możesz nawet mieć komendy ze spacjami: echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"produkuje hello worldzgodnie z oczekiwaniami. (Zakładając, że ~/binnależy do ciebie $PATH, oczywiście).
derobert
Sprawdź to pytanie i mój być może zbyt długi samouczek .
Emanuel Berg

Odpowiedzi:

13

Nie ma ograniczeń w nazwach poleceń w Uniksie. Dowolny plik może być poleceniem. Nazwa pliku może być dowolną sekwencją jednego lub więcej znaków (do limitu) znaków innych niż ASCII NUL lub ASCII /. zshnawet znosi to ograniczenie dla funkcji, w których możesz mieć dowolny ciąg jako nazwę funkcji.

Kilka uwag:

  • trudno ci będzie utworzyć plik poleceń o nazwie .lub ..;-).
  • Nazwy uniknąć sytuacji są już podjęte za pomocą standardowych poleceń lub powłoki poleceń wbudowanych lub słów kluczowych (przynajmniej z najczęstszych muszli jak bash, zsh, tcshlub ksh). W tym względzie pomocne mogą być wielkie litery, ponieważ na ogół nie są używane przez standardowe polecenia.
  • Lepiej ograniczyć się do znaków ASCII. Znaki inne niż ASCII nie są wyrażane tak samo w różnych zestawach znaków, które tam są
  • podczas gdy jesteś przy tym, ogranicz się do liter, cyfr, myślnika, kropki i podkreślenia. Cokolwiek innego, podczas prawnej, może powodować jeden problem lub inny z tego czy innego narzędzia (na przykład |, =, &i wielu innych, musiałyby być uciekł w muszli, jeśli użyjesz :, twoje polecenie nie może być stosowany jako czyjegoś powłokę logowania ... ). Możesz nawet chcieć wykluczyć .i -które nie są dozwolone w nazwach funkcji w wielu powłokach, na wypadek, gdybyś chciał pozwolić użytkownikom na zawinięcie polecenia w funkcję powłoki.
  • Zrób pierwszy znak literą. Ponownie, nie jest to ścisły wymóg. Ale podkreślenie jest czasem używane do specjalnych rzeczy (jak w zshfunkcjach zaczynających się od systemów uzupełniania _), a polecenia składające się z samych cyfr mogą być problemem w takich rzeczach cmd>output.log. Pliki, których nazwa zaczyna się od kropki, będą ukryte przez elementy takie jak lslub globusy powłoki i wiele menedżerów plików.
Stéphane Chazelas
źródło
Dobrze. Sądzę więc, że sprowadza się to do tego, że nie używaj niczego niezwykłego, chyba że masz ku temu dobry powód. Nawet twoja druga uwaga, nie sądzę, aby używanie wielkich liter do pokrywania tych powłok było tak sprytne - czy nie lepiej nazwać polecenie opisujące zmianę? Na przykład zsh_with_some_funky_option(zamiast ZSH)?
Emanuel Berg
Czy alias jest poleceniem? Bo jeśli tak, bardzo łatwo mi było pisać alias .="echo Hello".-) (Cóż, sudo vim /bin/.było trudniej ...)
Alois Mahdal
@AloisMahdal Dlatego powiedziałem plik poleceń . Zsh również pozwala .() echo Hello. Podobnie jak pdksh, ale .specjalne wbudowane ma tam pierwszeństwo.
Stéphane Chazelas
Ups, moja błędna interpretacja ... Interesujący punkt na temat pierwszeństwa pdksh ...
Alois Mahdal
27

Tak, może i jest ich już kilka. Takich jak /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

To 758 w całym Ubuntu 12.04. Pełna lista: https://gist.github.com/5264777

Dennis Kaarsemaker
źródło
Nie Xdialog? : o Powinieneś zacytować grepparametr, aby uniknąć rozszerzenia powłoki w bieżącym katalogu przed wykonaniem.
manatwork
Nie instaluj go w tym systemie :)
Dennis Kaarsemaker
2
Chciałbym nalegać na podanie grepparametru cytowania : pastebin.com/Gak7x9rN (Tak, mogę go edytować samodzielnie, ale wolę, abyś rozumiał dlaczego.)
manatwork
1
Może to zależeć również od powłoki. Użyłem wielkich liter w moim przykładzie dla przenośności, ale mój bashw moim katalogu domowym faktycznie [A-Z]zajmuje „cdfhjmpqrt”. Więc rozróżniaj wielkość liter.
manatwork
1
Nie wspominając zsho failglobopcji bash . Ja osobiście zazwyczaj nazwać moje pliki tymczasowe (w ~) a, b, c... i moje katalogi tymczasowe A, B, C...
Stéphane Chazelas
4

Najbardziej znanym poleceniem jest stty, które było również dostępne jako STTY. Przydało się przywrócenie terminalu do normalnego działania STTY SANE.

ott--
źródło
Nie mam /bin/sttynic więcej. Chcesz trochę opracować swoją odpowiedź?
Emanuel Berg
2
W dawnych dobrych czasach terminal mógł być tak zepsuty, że wszystko było pisane wielkimi literami. Więc wpisz, aa terminal zobaczy A. Aby przywrócić zdrowie psychiczne, użyłbyś stty sanepolecenia. Tyle że teraz jest to niemożliwe, dlatego też sttyudostępnienie tego STTYbyło bardzo mile widziane. Nie pamiętam nawet, kiedy ostatni raz tego potrzebowałem :)
Dennis Kaarsemaker
@DennisKaarsemaker: WOW! To jakiś fajny kawałek historii!
Emanuel Berg
1
Chłopaki (ott-- i @DennisKaarsemaker), macie to do tyłu. Opublikowałem kolejną odpowiedź w celu wyjaśnienia.
Stéphane Chazelas
4

Kilka uwag na temat STTYpolecenia historycznego w celu wyjaśnienia niektórych nieścisłości w drugiej odpowiedzi i powiązanych komentarzach :

Wcześniejsze terminale, takie jak DEC VT05 lub VT50 i wcześniejsze teleprintery obsługiwały tylko wielkie litery. Oznaczało to, że żadna mała litera nie może być od nich nigdy wprowadzona lub że nie będą w stanie wyświetlić żadnej innej litery niż wielkie litery.

W Uniksie rozróżniana jest wielkość liter, a większość poleceń ma małe litery, widać, że jest tam problem. Właśnie dlatego istnieją specjalne tryby termio / termios (i wciąż istnieją w nowoczesnych Unicach, nawet jeśli terminali już dawno nie ma), aby sobie z nimi poradzić.

termio / termios to odpowiednio starsze i nowsze interfejsy do sterowania sterownikiem tty w Uniksie. W termosach określasz ioctlflagi wejściowe, wyjściowe, sterujące ..., które określają sposób, w jaki sygnały elektryczne w linii szeregowej mają być przetwarzane na znaki wejściowe i wyjściowe oraz wewnętrzne zachowanie sterownika, takie jak echo, edytor linii ... Większość z nich dotyczy terminali wirtualnych, takich jak nowoczesne konsole Unix VGA lub pseudo terminale.

Interfejs wiersza poleceń termio(s)to sttypolecenie.

Aby obsłużyć duże litery, występują trzy termio(s)flagi:

  • IUCLC(Wprowadź wielkie i małe litery): przychodzące znaki są konwertowane na małe litery podczas wprowadzania. Oznacza to, że Awysłany przez terminal jest uważany za a. Oznacza to, że z tej pozycji ON, mogę teraz wpisywane LSna moim VT50, a powłoka będzie odczytane lsz /dev/ttyX. Mogę teraz także uruchomić sttypolecenie.
  • Teraz, używając IUCLCsamego i terminala echo, podczas pisania piszę LSsterownik odsyła z lspowrotem do terminala (aby zobaczyć, co wpisuję), którego nie może wyświetlić, więc potrzebujemy również OLCUC(Wyjście małych liter na wielkie litery), to znaczy przed wysłaniem do terminala musimy przekonwertować każdą małą literę na wielkie litery.
  • Teraz możemy obsługiwać Uniksa z VT50, ale co jeśli teraz chcemy wprowadzić wielkie litery? Tam właśnie pojawia się flaga xcase lokalna . Pozwala to (tylko w trybie wprowadzania kanonicznego) na wysyłanie wielkich liter Aprzez wpisanie \A, a na wyjściu, duża litera Ajest renderowana jako \A. (ten nie jest zaimplementowany w systemie Linux)

sttyKomenda ma odpowiednie iuclc, olcucoraz xcaseustawienia i alias dla wszystkich trzech: lcase. Domyślne ustawienie i to, co otrzymujesz, stty sanejest lcasewyłączone.

Kiedy korzystasz z VT50, wszystko, co musisz zrobić, to uruchomić:

stty lcase

móc coś zrobić. Ale poczekaj, jak to zrobić, gdy możesz wysyłać tylko wielkie litery? Właśnie tam potrzebujesz STTYpolecenia jako aliasu sttyi dlatego sttyobsługuje LCASEjako alias lcase.

Nie ma takiego SANEaliasu, ponieważ nie chcesz tego robić, stty sanegdy twój terminal jest pisany wielkimi literami.

Jeśli uruchamiasz stty lcaselub stty olcucprzez pomyłkę na normalnym terminalu (wypróbuj go xtermlub innym nowoczesnym terminalu), musisz tam wejść, stty saneaby wrócić do normalności. Ale nie potrzebujesz do tego STTYpolecenia. Jeśli wpiszesz stty sane, to będzie patrz STTY SANEechem z powrotem, ale to jest tylko wyświetlany tekst (nie weszła poleceń), które zostały przetłumaczone, to nadal jest stty sanepolecenie, które zostanie uruchomione.

Ci iuclc, olcuc, xcaseflagi używane do określenia przez POSIX (i to pewnie dlatego, że jest realizowany w systemie Linux, chociaż wątpię, ktokolwiek połączony każdy z tych starych terminali do systemu Linux (inne niż dla zabawy)), ale zostały usunięte w POSIX: 2001.

Stéphane Chazelas
źródło
2

W Fedorze 18 tutaj:

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

W sumie 50 (których nie znałem najbardziej).

vonbrand
źródło
1
50, ale 25 różnych.
Stéphane Chazelas
0

Na Debianie sid, z zsh i ls -1 $path | grep '[A-Z]', rozumiem

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

Edycja: Zauważ, że w powyższym poleceniu jest to cyfra jeden, a nie litera l. Jeden jak w jednej kolumnie.

Emanuel Berg
źródło
1
Z zshuruchom:type -m '*[A-Z]*'
Stéphane Chazelas
@StephaneChazelas: OK, twoja wyświetla ścieżkę wyszukiwania, a także zawiera funkcje powłoki. Ale moje jest również specyficzne dla Zsh: małe litery $pathnie są w bash, raz. Im więcej informacji, tym lepiej.
Emanuel Berg
1
Tak, nie powiedziałem, że twój jest zły, po prostu zasugerowałem alternatywę (choć zgodziłbym się, że to nie najlepsze sformułowanie). Zauważ, że $pathnie jest to specyficzne dla Zsh. Pochodzi z miejsca, w csh/tcshktórym działa również twoje polecenie.
Stéphane Chazelas
@StephaneChazelas: Aha, to interesujące! Nie, moje polecenie nie jest „złe”, ale zgadzam się, że twoje jest lepsze, ponieważ sensowne jest włączenie funkcji powłoki i aliasów. Przynajmniej dla mnie tak jest, ponieważ kiedy korzystam z komputera, nie dbam o to, czy jest to plik binarny, skrypt, funkcja, alias lub cokolwiek innego, o ile tylko mogę go uruchomić i spełnia swoje zadanie. (Myślę, że to -mjest na „mecz”).
Emanuel Berg