Une commande Linux peut-elle avoir des lettres majuscules?

17

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"?

terdon
la source
6
La convention UNIX consiste à utiliser des minuscules pour les noms de commande, mais vous êtes libre de les appeler comme vous le souhaitez.
1
En effet, UNIX se fiche de ce que vous appelez vos commandes. Cela causera beaucoup de douleur et de souffrance, mais vous pouvez même avoir des commandes avec des espaces: echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"produit hello worldcomme prévu. (En supposant que ~/binc'est dans votre $PATH, bien sûr).
derobert
Consultez cette question et mon tutoriel peut-être trop long .
Emanuel Berg

Réponses:

13

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 /. zshlève même cette limitation pour les fonctions où vous pouvez avoir n'importe quelle chaîne comme nom de fonction.

Quelques notes cependant:

  • vous aurez du mal à créer un fichier de commandes appelé .ou ..;-).
  • Les noms d'éviter que sont déjà prises par des commandes standard ou builtins ou des mots - clés shell (au moins des coquilles plus communes comme bash, zsh, tcshou ksh). À cet égard, les caractères majuscules peuvent être utiles car ils ne sont généralement pas utilisés par les commandes standard.
  • Il vaut mieux se limiter aux caractères ASCII. Les caractères non ASCII ne sont pas exprimés de la même manière dans les différents jeux de caractères disponibles
  • pendant que vous y êtes, limitez-vous aux lettres, chiffres, tirets, points et traits de soulignement. Tout le reste, bien que légale, peut causer un problème ou d'une autre avec tel ou tel outil (par exemple, |, =, &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.
  • Faites du premier caractère une lettre. Encore une fois, ce n'est pas une exigence stricte. Mais le trait de soulignement est parfois utilisé pour des choses spéciales (comme dans zshles fonctions des systèmes de complétion commencent par _), et les commandes à tous les chiffres peuvent être un problème dans des choses comme cmd>output.log. Les fichiers dont le nom commence par un point seront masqués par des éléments tels que lsdes globbings shell et de nombreux gestionnaires de fichiers.
Stéphane Chazelas
la source
Droite. Donc je suppose que cela se résume à, n'utilisez rien d'extraordinaire à moins que vous n'ayez une bonne raison de le faire. Même votre deuxième point, je ne pense pas que l'utilisation de majuscules pour couvrir ces shells soit aussi intelligente - n'est-il pas préférable de nommer la commande pour décrire le changement? Comme zsh_with_some_funky_option(au lieu de ZSH)?
Emanuel Berg
L'alias est-il une commande? Parce que si oui, j'ai eu du mal à taper du temps alias .="echo Hello".-) (Bon, sudo vim /bin/.c'était plus dur
quand
@AloisMahdal C'est pourquoi j'ai dit fichier de commande . zsh le permet également .() echo Hello. Il en est de même pour pdksh, mais le .module intégré spécial y est prioritaire.
Stéphane Chazelas
Oups, ma mauvaise lecture ... Un point intéressant sur les précédents pdksh, cependant ...
Alois Mahdal
27

Oui, et il y en a déjà quelques-uns. Tels que /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

C'est donc 758 dans tout Ubuntu 12.04. Liste complète: https://gist.github.com/5264777

Dennis Kaarsemaker
la source
Non Xdialog? : o Et vous devriez citer greple paramètre de pour éviter que le shell ne le développe dans le répertoire courant avant l'exécution.
manatwork
Ne pas l'installer sur ce système :)
Dennis Kaarsemaker
2
Je voudrais insister pour citer greple paramètre de: pastebin.com/Gak7x9rN (Oui, je peux le modifier moi-même, mais je préfère que vous compreniez pourquoi.)
manatwork
1
Eh bien, cela peut aussi dépendre du shell. J'ai utilisé des majuscules dans mon exemple pour la portabilité, mais mon bashdans mon répertoire personnel passe en fait [A-Z]à «cdfhjmpqrt». Donc insensiblement.
manatwork
1
Sans parler de zshl' failgloboption de bash . Je nomme personnellement généralement mes fichiers temporaires (en ~) a, b, c... et mon dirs temporaires A, B, C...
Stéphane Chazelas
4

La commande la plus célèbre est stty, qui était également disponible en tant que STTY. Il était très pratique de remettre le terminal à un comportement normal avec STTY SANE.

ott--
la source
Je n'ai /bin/sttyrien d'autre. Voulez-vous élaborer un peu votre réponse?
Emanuel Berg
2
Au bon vieux temps, il était possible que votre terminal soit tellement foutu, que tout était en majuscules. Alors tapez aet le terminal verrait A. Pour restaurer la santé mentale, vous utiliseriez la stty sanecommande. Sauf que cela est désormais impossible, donc avoir à sttydisposition comme STTYc'était très bienvenu. Je ne me souviens même pas de la dernière fois où j'en avais besoin :)
Dennis Kaarsemaker
@DennisKaarsemaker: WOW! C'est un morceau d'histoire cool!
Emanuel Berg
1
Les gars (ott-- et @DennisKaarsemaker), vous l'avez à l'envers. J'ai posté une autre réponse pour clarification.
Stéphane Chazelas
4

Quelques notes sur la STTYcommande 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 la sttycommande.

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' Aenvoi par le terminal est considéré comme un a. Cela signifie que ce, je peux maintenant taper LSsur mon VT50, et la coquille lirai à lspartir /dev/ttyX. Je peux aussi maintenant exécuter la sttycommande.
  • Maintenant, avec IUCLCseul et terminal echo, pendant que je tape LS, le pilote lsrenvoie au terminal (pour que je puisse voir ce que je tape) qu'il ne peut pas afficher, nous avons donc également besoin de OLCUC(Output Lower Case to Upper Case), c'est-à-dire nous devons convertir toute lettre minuscule en majuscule avant de l'envoyer au terminal.
  • Maintenant, nous pouvons utiliser Unix à partir d'un VT50, mais que se passe-t-il si nous voulons saisir des caractères majuscules maintenant? C'est là que le drapeau xcase local entre en jeu. Cela permet (en mode d'entrée canonique uniquement) d'envoyer une majuscule Aen tapant \A, et en sortie, une majuscule Aest rendue sous la forme \A. (celui-là n'est pas implémenté sous Linux)

La sttycommande a les correspondants iuclc, olcucet les xcaseparamètres et un alias pour les trois: lcase. Le paramètre par défaut et ce que vous obtenez après stty saneest lcasedésactivé.

Ainsi, lorsque vous êtes sur un VT50, il vous suffit de lancer:

stty lcase

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 STTYcommande comme alias pour stty, et c'est pourquoi les sttysupports LCASEcomme alias pour lcase.

Il n'y a pas d' SANEalias de ce type car vous ne voulez pas le faire stty sanelorsque votre terminal est tout en majuscules.

Si vous exécutez stty lcaseou stty olcucpar erreur sur un terminal normal (essayez-le xtermou tout autre terminal moderne), c'est là que vous devez entrer stty sanepour revenir à la normale. Mais vous n'avez pas besoin d'une STTYcommande pour cela. Si vous tapez stty sane, vous allez voyez en STTY SANEécho, mais c'est seulement le texte affiché (la commande entrée) qui ont été traduits, il est toujours la stty sanecommande qui sera exécutée.

Ceux iuclc-ci olcuc, les xcasedrapeaux é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.

Stéphane Chazelas
la source
2

Sur Fedora 18 ici:

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

Pour un total de 50 (dont je ne connaissais pas le plus).

vonbrand
la source
1
50, mais 25 distincts.
Stéphane Chazelas
0

Sur Sidian Debian, avec zsh, et ls -1 $path | grep '[A-Z]'je reçois

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

Edit: Notez que, dans la commande ci-dessus, c'est le chiffre un, pas la lettre l. Un comme dans une colonne.

Emanuel Berg
la source
1
Avec zsh, courez:type -m '*[A-Z]*'
Stéphane Chazelas
@StephaneChazelas: OK, le vôtre affiche le chemin de recherche, et comprend également des fonctions shell. Mais le mien est également spécifique à zsh: les minuscules $pathne sont pas en bash, pour une fois. Eh bien, plus il y a d'informations, mieux c'est.
Emanuel Berg
1
Oui, je n'ai pas dit que la vôtre était fausse, j'ai simplement suggéré une alternative (bien que je convienne que ce n'était pas la meilleure formulation). Notez que ce $pathn'est pas spécifique à zsh. Il vient d' csh/tcshoù votre commande fonctionne également.
Stéphane Chazelas
@StephaneChazelas: Aha, c'est intéressant! Non, ma commande n'est pas "fausse" mais je conviens que la vôtre est meilleure car il est logique d'inclure des fonctions shell et des alias. Du moins pour moi, c'est le cas, car lorsque j'utilise mon ordinateur, je me fiche que ce soit un binaire, un script, une fonction, un alias ou autre, tant que je peux l'exécuter et qu'il fait son travail. (Je suppose que -mc'est pour "match".)
Emanuel Berg