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”?
linux
shell
command-line
terdon
źródło
źródło
echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"
produkujehello world
zgodnie z oczekiwaniami. (Zakładając, że~/bin
należy do ciebie$PATH
, oczywiście).Odpowiedzi:
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
/
.zsh
nawet znosi to ograniczenie dla funkcji, w których możesz mieć dowolny ciąg jako nazwę funkcji.Kilka uwag:
.
lub..
;-).bash
,zsh
,tcsh
lubksh
). W tym względzie pomocne mogą być wielkie litery, ponieważ na ogół nie są używane przez standardowe polecenia.|
,=
,&
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.zsh
funkcjach zaczynających się od systemów uzupełniania_
), a polecenia składające się z samych cyfr mogą być problemem w takich rzeczachcmd>output.log
. Pliki, których nazwa zaczyna się od kropki, będą ukryte przez elementy takie jakls
lub globusy powłoki i wiele menedżerów plików.źródło
zsh_with_some_funky_option
(zamiastZSH
)?alias .="echo Hello"
.-) (Cóż,sudo vim /bin/.
było trudniej ...).() echo Hello
. Podobnie jak pdksh, ale.
specjalne wbudowane ma tam pierwszeństwo.Tak, może i jest ich już kilka. Takich jak
/usr/bin/X
:)To 758 w całym Ubuntu 12.04. Pełna lista: https://gist.github.com/5264777
źródło
Xdialog
? : o Powinieneś zacytowaćgrep
parametr, aby uniknąć rozszerzenia powłoki w bieżącym katalogu przed wykonaniem.grep
parametru cytowania : pastebin.com/Gak7x9rN (Tak, mogę go edytować samodzielnie, ale wolę, abyś rozumiał dlaczego.)bash
w moim katalogu domowym faktycznie[A-Z]
zajmuje „cdfhjmpqrt”. Więc rozróżniaj wielkość liter.zsh
ofailglob
opcji bash . Ja osobiście zazwyczaj nazwać moje pliki tymczasowe (w~
)a
,b
,c
... i moje katalogi tymczasoweA
,B
,C
...Najbardziej znanym poleceniem jest
stty
, które było również dostępne jakoSTTY
. Przydało się przywrócenie terminalu do normalnego działaniaSTTY SANE
.źródło
/bin/stty
nic więcej. Chcesz trochę opracować swoją odpowiedź?a
a terminal zobaczyA
. Aby przywrócić zdrowie psychiczne, użyłbyśstty sane
polecenia. Tyle że teraz jest to niemożliwe, dlatego teżstty
udostępnienie tegoSTTY
było bardzo mile widziane. Nie pamiętam nawet, kiedy ostatni raz tego potrzebowałem :)Kilka uwag na temat
STTY
polecenia 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
ioctl
flagi 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)
tostty
polecenie.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, żeA
wysłany przez terminal jest uważany zaa
. Oznacza to, że z tej pozycji ON, mogę teraz wpisywaneLS
na moim VT50, a powłoka będzie odczytanels
z/dev/ttyX
. Mogę teraz także uruchomićstty
polecenie.IUCLC
samego i terminalaecho
, podczas pisania piszęLS
sterownik odsyła zls
powrotem 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.xcase
lokalna . Pozwala to (tylko w trybie wprowadzania kanonicznego) na wysyłanie wielkich literA
przez wpisanie\A
, a na wyjściu, duża literaA
jest renderowana jako\A
. (ten nie jest zaimplementowany w systemie Linux)stty
Komenda ma odpowiednieiuclc
,olcuc
orazxcase
ustawienia i alias dla wszystkich trzech:lcase
. Domyślne ustawienie i to, co otrzymujesz,stty sane
jestlcase
wyłączone.Kiedy korzystasz z VT50, wszystko, co musisz zrobić, to uruchomić:
móc coś zrobić. Ale poczekaj, jak to zrobić, gdy możesz wysyłać tylko wielkie litery? Właśnie tam potrzebujesz
STTY
polecenia jako aliasustty
i dlategostty
obsługujeLCASE
jako aliaslcase
.Nie ma takiego
SANE
aliasu, ponieważ nie chcesz tego robić,stty sane
gdy twój terminal jest pisany wielkimi literami.Jeśli uruchamiasz
stty lcase
lubstty olcuc
przez pomyłkę na normalnym terminalu (wypróbuj goxterm
lub innym nowoczesnym terminalu), musisz tam wejść,stty sane
aby wrócić do normalności. Ale nie potrzebujesz do tegoSTTY
polecenia. Jeśli wpiszeszstty sane
, to będzie patrzSTTY SANE
echem z powrotem, ale to jest tylko wyświetlany tekst (nie weszła poleceń), które zostały przetłumaczone, to nadal jeststty sane
polecenie, które zostanie uruchomione.Ci
iuclc
,olcuc
,xcase
flagi 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.źródło
W Fedorze 18 tutaj:
W sumie 50 (których nie znałem najbardziej).
źródło
Na Debianie sid, z zsh i
ls -1 $path | grep '[A-Z]'
, rozumiemEdycja: Zauważ, że w powyższym poleceniu jest to cyfra jeden, a nie litera
l
. Jeden jak w jednej kolumnie.źródło
zsh
uruchom:type -m '*[A-Z]*'
$path
nie są w bash, raz. Im więcej informacji, tym lepiej.$path
nie jest to specyficzne dla Zsh. Pochodzi z miejsca, wcsh/tcsh
którym działa również twoje polecenie.-m
jest na „mecz”).