Kann ein Linux-Befehl Großbuchstaben enthalten? Ich weiß, dass es unterstützt wird, aber ich möchte sicher sein, ob es ein "Problem" ist oder "keine gute Sache" ist?
linux
shell
command-line
terdon
quelle
quelle
echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"
Produzierthello world
wie erwartet. (Vorausgesetzt, es~/bin
liegt in Ihrem$PATH
).Antworten:
Es gibt keine Einschränkung für Befehlsnamen unter Unix. Jede Datei kann ein Befehl sein. Und ein Dateiname kann eine beliebige Folge von einem oder mehreren (bis zu einer gewissen Grenze) anderen Zeichen als ASCII NUL oder ASCII sein
/
.zsh
hebt diese Einschränkung sogar für Funktionen auf, bei denen Sie eine beliebige Zeichenfolge als Funktionsnamen verwenden können.Ein paar Anmerkungen:
.
oder zu erstellen..
;-).bash
,zsh
,tcsh
oderksh
). In dieser Hinsicht können Großbuchstaben hilfreich sein, da sie in der Regel nicht von Standardbefehlen verwendet werden.|
,=
,&
und viele andere müssten in Schalen entkommen werden, wenn Sie verwenden:
, kann Ihr Befehl nicht als einer der Login - Shell verwendet werden ... ). Sie können sogar ausschließen wollen.
und-
die nicht in Funktionsnamen in vielen Schalen erlaubt, falls Sie es Benutzern ermöglichen möchten Ihren Befehl in einer Shell - Funktion zu wickeln.zsh
den Funktionen, mit denen die Vervollständigungssysteme beginnen_
), und all-stellige Befehle können in Dingen wie ein Problem seincmd>output.log
. Dateien, deren Name mit einem Punkt beginnt, werden vonls
Objekten wie oder Shell-Globbings und vielen Dateimanagern ausgeblendet .quelle
zsh_with_some_funky_option
(anstelle vonZSH
)?alias .="echo Hello"
.-) (Nun,sudo vim /bin/.
war allerdings schwieriger ...).() echo Hello
. Pdksh auch, aber das.
spezielle Builtin hat dort Vorrang.Ja, das kann es, und es gibt bereits einige. Wie
/usr/bin/X
:)Das sind 758 in Ubuntu 12.04. Vollständige Liste: https://gist.github.com/5264777
quelle
Xdialog
? : o Und Sie solltengrep
den Parameter in Anführungszeichen setzen , um zu vermeiden, dass die Shell ihn vor der Ausführung im aktuellen Verzeichnis erweitert.grep
, den Parameter desbash
Gründen der Portabilität Großbuchstaben verwendet, in meinem Ausgangsverzeichnis[A-Z]
jedoch "cdfhjmpqrt". Also Groß- und Kleinschreibung beachten.zsh
oder bashsfailglob
Option. Ich persönlich nenne normalerweise meine temporären Dateien (in~
)a
,b
,c
... und meine Temperatur dirsA
,B
,C
...Der bekannteste Befehl ist
stty
, der auch als verfügbar warSTTY
. Es war sehr praktisch, das Terminal mit wieder auf normales Verhalten zurückzusetzenSTTY SANE
.quelle
/bin/stty
aber sonst nichts. Möchten Sie Ihre Antwort ein wenig ausarbeiten?a
und das Terminal würde sehenA
. Um die Vernunft wiederherzustellen, würden Sie denstty sane
Befehl verwenden. Abgesehen davon, dass dies jetzt unmöglich ist, war es daher sehr willkommen ,stty
verfügbar zu seinSTTY
. Ich kann mich nicht einmal erinnern,Einige Anmerkungen zum historischen
STTY
Befehl, um einige Ungenauigkeiten in der anderen Antwort und den zugehörigen Kommentaren zu klären :Frühere Terminals wie das DEC VT05 oder VT50 und die vorherigen Ferndrucker unterstützten nur Großbuchstaben. Dies bedeutete, dass von ihnen niemals Kleinbuchstaben eingegeben werden konnten oder dass sie keinen anderen Buchstaben als Großbuchstaben anzeigen konnten.
Bei Unix wird zwischen Groß- und Kleinschreibung unterschieden und bei den meisten Befehlen wird ein Problem angezeigt. Aus diesem Grund gibt es spezielle Termio / Termios-Modi (und die gibt es in modernen Unices immer noch, obwohl diese Terminals schon lange nicht mehr existieren), um diese zu handhaben.
termio / termios sind die älteren und neueren Schnittstellen zur Steuerung des tty-Treibers unter Unix. In einem Termio (s)
ioctl
spezifizieren Sie Input, Output, Control Flags ..., die festlegen, wie die elektrischen Signale auf einer seriellen Leitung in Input- und Output-Zeichen und das interne Verhalten des Treibers bei Dingen wie Echo, Echo usw. verarbeitet werden sollen Zeileneditor ... Die meisten davon betreffen virtuelle Terminals wie moderne Unix-VGA-Konsolen oder Pseudoterminals.Die Befehlszeilenschnittstelle für
termio(s)
ist derstty
Befehl.Für die Verarbeitung von Terminals in Großbuchstaben sind drei
termio(s)
Flags erforderlich:IUCLC
(Eingabe von Groß- in Kleinbuchstaben): Eingehende Zeichen werden bei der Eingabe in Kleinbuchstaben umgewandelt. Das heißt, dasA
vom Terminal gesendete wird als eina
. Das bedeutet , dass mit diesem, ich jetzt geben kannLS
auf meine VT50 und die Schale wird gelesenls
aus/dev/ttyX
. Ich kann denstty
Befehl jetzt auch ausführen .IUCLC
alone und terminal schickte der Treiberecho
währendLS
der Eingabels
an das Terminal zurück (damit ich sehen kann, was ich tippe), was nicht angezeigt werden kann. Wir brauchen also auchOLCUC
(Ausgabe von Kleinbuchstaben in Großbuchstaben) Wir müssen jeden Kleinbuchstaben in Großbuchstaben umwandeln, bevor wir ihn an das Terminal senden.xcase
lokale Flag ins Spiel. Dies ermöglicht (nur im kanonischen Eingabemodus) das Senden von GroßbuchstabenA
durch Eingabe\A
, und bei der Ausgabe wird ein GroßbuchstabeA
als gerendert\A
. (dieser ist nicht unter Linux implementiert)Der
stty
Befehl hat die entsprechendeniuclc
,olcuc
undxcase
Einstellungen und einen Aliasnamen für alle drei:lcase
. Die Standardeinstellung und was Sie danach bekommen,stty sane
istlcase
aus.Wenn Sie also mit einem VT50 arbeiten, müssen Sie nur Folgendes ausführen:
in der Lage sein, alles zu tun. Aber Moment mal, wie geht das, wenn Sie nur Großbuchstaben versenden können? Das ist , wo Sie einen benötigen
STTY
Befehl als Alias fürstty
, und deshalbstty
unterstütztLCASE
als Alias fürlcase
.Es gibt keinen solchen
SANE
Alias, da Sie dies nicht möchten,stty sane
wenn Ihr Terminal nur in Großbuchstaben geschrieben ist.Wenn Sie laufen
stty lcase
oderstty olcuc
versehentlich auf einem normalen Terminal (versuchen Sie es inxterm
oder jeder modernen Terminal), das ist , wo Sie eingeben müssen ,stty sane
um Normalität zurückkehren. Dafür brauchen Sie aber keinenSTTY
Befehl. Wenn Sie eingebenstty sane
, Sie werden sehenSTTY SANE
Echo zurück, aber das ist nur der angezeigte Text (nicht der eingegebene Befehl) , die übersetzt worden sein , es ist immer noch derstty sane
Befehl, der ausgeführt werden soll.Diejenigen
iuclc
,olcuc
,xcase
verwendeten Flaggen von POSIX spezifiziert werden (und das ist wahrscheinlich , warum es auf Linux implementiert wird , obwohl ich ernsthaft jemand jemals verbunden ein dieses alten Terminals zu einem Linux - System (außer zum Spaß) zweifeln), aber entfernt worden in POSIX: 2001.quelle
Auf Fedora 18 hier:
Für insgesamt 50 (von denen ich die meisten nicht kannte).
quelle
Auf Debian Sid, mit zsh und
ls -1 $path | grep '[A-Z]'
, verstehe ichBearbeiten: Beachten Sie, dass dies im obigen Befehl die Ziffer und nicht der Buchstabe ist
l
. Eine Eins wie in einer Spalte.quelle
zsh
, laufen:type -m '*[A-Z]*'
$path
sind ausnahmsweise nicht in Bash. Je mehr Informationen, desto besser.$path
nicht zsh-spezifisch ist. Es kommt von dort,csh/tcsh
wo Ihr Befehl auch funktioniert.-m
ist für "Match".)