Une commande Linux peut-elle avoir des lettres majuscules? Je sais que c'est supporté mais je veux être sûr si c'est un "problème" ou considéré comme "pas une bonne chose"?
linux
shell
command-line
terdon
la source
la source
echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"
produithello world
comme prévu. (En supposant que~/bin
c'est dans votre$PATH
, bien sûr).Réponses:
Il n'y a aucune restriction sur les noms de commandes sous Unix. Tout fichier peut être une commande. Et un nom de fichier peut être n'importe quelle séquence d'un ou plusieurs (jusqu'à une limite cependant) de caractères autres que ASCII NUL ou ASCII
/
.zsh
lève même cette limitation pour les fonctions où vous pouvez avoir n'importe quelle chaîne comme nom de fonction.Quelques notes cependant:
.
ou..
;-).bash
,zsh
,tcsh
ouksh
). À cet égard, les caractères majuscules peuvent être utiles car ils ne sont généralement pas utilisés par les commandes standard.|
,=
,&
et bien d' autres devrait être échappé dans des coquilles, si vous utilisez:
, votre commande ne peut pas être utilisé comme une coquille de connexion ... ). Vous pouvez même vouloir exclure.
et-
qui ne sont pas autorisés dans les noms de fonction dans de nombreux shells, au cas où vous voudriez autoriser les utilisateurs à encapsuler votre commande dans une fonction shell.zsh
les fonctions des systèmes de complétion commencent par_
), et les commandes à tous les chiffres peuvent être un problème dans des choses commecmd>output.log
. Les fichiers dont le nom commence par un point seront masqués par des éléments tels quels
des globbings shell et de nombreux gestionnaires de fichiers.la source
zsh_with_some_funky_option
(au lieu deZSH
)?alias .="echo Hello"
.-) (Bon,sudo vim /bin/.
c'était plus dur.() echo Hello
. Il en est de même pour pdksh, mais le.
module intégré spécial y est prioritaire.Oui, et il y en a déjà quelques-uns. Tels que
/usr/bin/X
:)C'est donc 758 dans tout Ubuntu 12.04. Liste complète: https://gist.github.com/5264777
la source
Xdialog
? : o Et vous devriez citergrep
le paramètre de pour éviter que le shell ne le développe dans le répertoire courant avant l'exécution.grep
le paramètre de: pastebin.com/Gak7x9rN (Oui, je peux le modifier moi-même, mais je préfère que vous compreniez pourquoi.)bash
dans mon répertoire personnel passe en fait[A-Z]
à «cdfhjmpqrt». Donc insensiblement.zsh
l'failglob
option de bash . Je nomme personnellement généralement mes fichiers temporaires (en~
)a
,b
,c
... et mon dirs temporairesA
,B
,C
...La commande la plus célèbre est
stty
, qui était également disponible en tant queSTTY
. Il était très pratique de remettre le terminal à un comportement normal avecSTTY SANE
.la source
/bin/stty
rien d'autre. Voulez-vous élaborer un peu votre réponse?a
et le terminal verraitA
. Pour restaurer la santé mentale, vous utiliseriez lastty sane
commande. Sauf que cela est désormais impossible, donc avoir àstty
disposition commeSTTY
c'était très bienvenu. Je ne me souviens même pas de la dernière fois où j'en avais besoin :)Quelques notes sur la
STTY
commande historique pour clarifier certaines inexactitudes dans l' autre réponse et commentaires associés :Les terminaux antérieurs comme le DEC VT05 ou VT50 et les téléimprimeurs avant cela ne supportaient que les caractères majuscules. Cela signifiait qu'aucun caractère minuscule ne pourrait jamais être entré de leur part ou qu'ils ne pourraient pas afficher d'autre lettre que les majuscules.
Unix étant sensible à la casse et la plupart des commandes étant en minuscules, vous pouvez voir qu'il y a un problème. C'est pourquoi il existe des modes termio / termios spéciaux (et qui existent toujours dans les Unices modernes, même si ces terminaux ont disparu depuis longtemps) pour les gérer.
termio / termios sont respectivement les interfaces les plus anciennes et les plus récentes pour contrôler le pilote tty sous Unix. Dans une ou plusieurs termio (s)
ioctl
, vous spécifiez des drapeaux d'entrée, de sortie, de contrôle ... qui spécifient comment les signaux électriques sur une ligne série doivent être traités en caractères d'entrée et de sortie et le comportement interne du pilote par rapport à l'écho, le éditeur de ligne ... La plupart d'entre eux s'appliquent aux terminaux virtuels comme les consoles VGA Unix modernes ou les pseudo terminaux.L'interface de ligne de commande pour
termio(s)
est lastty
commande.Pour gérer les terminaux en majuscules, trois
termio(s)
indicateurs sont impliqués:IUCLC
(Entrée majuscules en minuscules): les caractères entrants sont convertis en minuscules lors de la saisie. Cela signifie que l'A
envoi par le terminal est considéré comme una
. Cela signifie que ce, je peux maintenant taperLS
sur mon VT50, et la coquille lirai àls
partir/dev/ttyX
. Je peux aussi maintenant exécuter lastty
commande.IUCLC
seul et terminalecho
, pendant que je tapeLS
, le pilotels
renvoie au terminal (pour que je puisse voir ce que je tape) qu'il ne peut pas afficher, nous avons donc également besoin deOLCUC
(Output Lower Case to Upper Case), c'est-à-dire nous devons convertir toute lettre minuscule en majuscule avant de l'envoyer au terminal.xcase
local entre en jeu. Cela permet (en mode d'entrée canonique uniquement) d'envoyer une majusculeA
en tapant\A
, et en sortie, une majusculeA
est rendue sous la forme\A
. (celui-là n'est pas implémenté sous Linux)La
stty
commande a les correspondantsiuclc
,olcuc
et lesxcase
paramètres et un alias pour les trois:lcase
. Le paramètre par défaut et ce que vous obtenez aprèsstty sane
estlcase
désactivé.Ainsi, lorsque vous êtes sur un VT50, il vous suffit de lancer:
pour pouvoir faire n'importe quoi. Mais attendez, comment faites-vous cela lorsque vous ne pouvez envoyer que des lettres majuscules? C'est là que vous avez besoin d'une
STTY
commande comme alias pourstty
, et c'est pourquoi lesstty
supportsLCASE
comme alias pourlcase
.Il n'y a pas d'
SANE
alias de ce type car vous ne voulez pas le fairestty sane
lorsque votre terminal est tout en majuscules.Si vous exécutez
stty lcase
oustty olcuc
par erreur sur un terminal normal (essayez-lexterm
ou tout autre terminal moderne), c'est là que vous devez entrerstty sane
pour revenir à la normale. Mais vous n'avez pas besoin d'uneSTTY
commande pour cela. Si vous tapezstty sane
, vous allez voyez enSTTY SANE
écho, mais c'est seulement le texte affiché (la commande entrée) qui ont été traduits, il est toujours lastty sane
commande qui sera exécutée.Ceux
iuclc
-ciolcuc
, lesxcase
drapeaux étaient spécifiés par POSIX (et c'est probablement pourquoi il est implémenté sur Linux même si je doute sérieusement que quiconque ait jamais connecté l'un de ces anciens terminaux à un système Linux (autre que pour le plaisir)), mais ont été supprimés dans POSIX: 2001.la source
Sur Fedora 18 ici:
Pour un total de 50 (dont je ne connaissais pas le plus).
la source
Sur Sidian Debian, avec zsh, et
ls -1 $path | grep '[A-Z]'
je reçoisEdit: Notez que, dans la commande ci-dessus, c'est le chiffre un, pas la lettre
l
. Un comme dans une colonne.la source
zsh
, courez:type -m '*[A-Z]*'
$path
ne sont pas en bash, pour une fois. Eh bien, plus il y a d'informations, mieux c'est.$path
n'est pas spécifique à zsh. Il vient d'csh/tcsh
où votre commande fonctionne également.-m
c'est pour "match".)