Un comando Linux può contenere lettere maiuscole?


17

Un comando Linux può contenere lettere maiuscole? So che è supportato ma voglio essere sicuro che si tratti di un "problema" o considerato "non una buona cosa"?


6
La convenzione UNIX prevede l'uso di lettere minuscole per i nomi dei comandi, ma sei libero di chiamarli come preferisci.

1
In effetti, UNIX non si preoccupa di come chiami i tuoi comandi. Provocherà molto dolore e sofferenza, ma puoi anche avere comandi con spazi in essi: echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"produce hello worldcome previsto. (Supponendo che ~/binsia nel tuo $PATH, ovviamente).
derobert,

Dai un'occhiata a questa domanda e al mio tutorial forse troppo lungo .
Emanuel Berg,

Risposte:


13

Non ci sono restrizioni sui nomi dei comandi su Unix. Qualsiasi file può essere un comando. E un nome file può essere qualsiasi sequenza di uno o più (fino a un limite) di caratteri diversi da ASCII NUL o ASCII /. zshsolleva persino tale limitazione per le funzioni in cui è possibile avere qualsiasi stringa come nome della funzione.

Alcune note però:

  • avrai difficoltà a creare un file di comandi chiamato .o ..;-).
  • nomi evitare che sono già adottate da comandi standard o comandi incorporati della shell o parole chiave (almeno delle maggior parte delle shell comuni come bash, zsh, tcsho ksh). A tale proposito, i caratteri maiuscoli possono essere di aiuto in quanto non vengono generalmente utilizzati dai comandi standard.
  • È meglio limitare ai caratteri ASCII. I caratteri non ASCII non sono espressi allo stesso modo nei vari set di caratteri disponibili
  • mentre ci sei, limitati a lettere, cifre, trattino, punto e trattino basso. Tutto il resto, mentre legale, può causare un problema o di un altro con questo o quello strumento (per esempio, |, =, &e molti altri avrebbe bisogno di essere sfuggito in conchiglie, se si utilizza :, il comando non può essere usato come una shell di login ... ). È anche possibile che si desideri escludere .e -che non sono consentiti nei nomi di funzione in molte shell, nel caso in cui si desideri consentire agli utenti di racchiudere il comando in una funzione di shell.
  • Trasforma il primo personaggio in una lettera. Ancora una volta, non è un requisito rigoroso. Ma il carattere di sottolineatura è talvolta usato per cose speciali (come nelle zshfunzioni dai sistemi di completamento iniziano con _), e comandi a tutte le cifre possono essere un problema in cose come cmd>output.log. I file il cui nome inizia con un punto saranno nascosti da cose come lso shell globbings e molti file manager.

Giusto. Quindi credo che si riduce a, non usare nulla di straordinario a meno che tu non abbia una buona ragione per farlo. Anche il tuo secondo punto, non penso che usare maiuscole per coprire quelle shell sia così intelligente - non è meglio nominare il comando per descrivere il cambiamento? Tipo zsh_with_some_funky_option(invece di ZSH)?
Emanuel Berg,

L'alias è un comando? Perché se sì, mi sono divertito molto a digitare alias .="echo Hello".-) (Beh, è sudo vim /bin/.stato più difficile, però ...)
Alois Mahdal

@AloisMahdal Ecco perché ho detto il file di comando . zsh lo permette anche .() echo Hello. Lo stesso vale per pdksh, ma il .builtin speciale ha la precedenza lì.
Stéphane Chazelas,

Oops, mio ​​errore di lettura ... Punto interessante sulle precedenti pdksh, però ...
Alois Mahdal,

27

Sì, può, e ce ne sono già alcuni. Come /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

Quindi sono 758 in tutto Ubuntu 12.04. Elenco completo: https://gist.github.com/5264777


No Xdialog? : o E 'necessario citare grepil parametro per evitare che la shell lo espanda nella directory corrente prima dell'esecuzione.
arte

Non averlo installato su questo sistema :)
Dennis Kaarsemaker,

2
Vorrei insistere per citare grepil parametro: pastebin.com/Gak7x9rN (Sì, posso modificarlo da solo, ma preferisco che capisca il perché.)
manatwork

1
Bene, può dipendere anche dalla shell. Ho usato lettere maiuscole nel mio esempio per la portabilità, ma la mia bashnella mia directory home in realtà si estende [A-Z]a "cdfhjmpqrt". Quindi caso insensibile.
arte

1
Per non parlare dell'opzione zshdi Bash failglob. Io personalmente solito nomino miei file temporanei (in ~) a, b, c... e la mia dirs temporanei A, B, C...
Stéphane Chazelas

4

Il comando più famoso è stty, che era anche disponibile come STTY. È stato molto utile riportare il terminale al comportamento normale con STTY SANE.


Non ho /bin/sttynient'altro. Vuoi elaborare un po 'la tua risposta?
Emanuel Berg,

2
Ai vecchi tempi, era possibile che il tuo terminale diventasse così incasinato, che tutto era maiuscolo. Quindi digitare ae il terminale vedrebbe A. Per ripristinare la sanità mentale, utilizzare il stty sanecomando. Solo che questo ora è impossibile, quindi avere a sttydisposizione come STTYera molto gradito. Non riesco nemmeno a ricordare l'ultima volta che ne avevo bisogno :)
Dennis Kaarsemaker,

@DennisKaarsemaker: WOW! Questo è un bel pezzo di storia!
Emanuel Berg,

1
Ragazzi (ott-- e @DennisKaarsemaker), ce l'hai al contrario. Ho pubblicato un'altra risposta per chiarimenti.
Stéphane Chazelas,

4

Alcune note sul STTYcomando storico per chiarire alcune imprecisioni nell'altra risposta e commenti associati :

I terminali precedenti come DEC VT05 o VT50 e le teleprinter prima supportavano solo caratteri maiuscoli. Ciò significava che nessun carattere minuscolo poteva mai essere inserito da loro o che non sarebbero stati in grado di visualizzare lettere diverse da quelle maiuscole.

Unix fa distinzione tra maiuscole e minuscole e la maggior parte dei comandi è minuscola, puoi vedere che c'è un problema lì. Ecco perché ci sono speciali modalità termio / termios (e che sono ancora presenti nei moderni Unices anche se quei terminali sono spariti da tempo) per gestirli.

termio / termios sono rispettivamente le interfacce più vecchie e più recenti per controllare il driver tty su Unix. In una (e) termina (e) ioctl, si specificano input, output, flag di controllo ... che specificano come i segnali elettrici su una linea seriale devono essere gestiti in caratteri di input e output e il comportamento interno del driver scrive cose come l'eco, il line editor ... La maggior parte di questi si applica a terminali virtuali come le moderne console VGA Unix o pseudo terminali.

L'interfaccia della riga di comando termio(s)è il sttycomando.

Per gestire i terminali maiuscoli, sono termio(s)coinvolti tre flag:

  • IUCLC(Immetti maiuscolo in minuscolo): i caratteri in arrivo vengono convertiti in minuscolo quando immessi. Ciò significa che l' Ainvio dal terminale è considerato come a a. Ciò significa che con questo, ora posso digitare LSsul mio VT50 e la shell leggerà lsda /dev/ttyX. Ora posso anche eseguire il sttycomando.
  • Ora, con IUCLCsolo e terminale echo, mentre scrivo LS, il driver rimanderebbe lsal terminale (così posso vedere quello che scrivo) che non può visualizzare, quindi abbiamo anche bisogno di OLCUC(Uscita da minuscole a maiuscole), cioè dobbiamo convertire le lettere minuscole in maiuscole prima di inviarle al terminale.
  • Ora, possiamo utilizzare Unix da un VT50, ma cosa succede se vogliamo inserire caratteri maiuscoli ora? È qui che entra in gioco il flag xcase locale . Ciò consente (solo in modalità di input canonica) di inviare un maiuscolo Adigitando \Ae, in uscita, Aviene visualizzato un maiuscolo come \A. (quello non è implementato su Linux)

Il sttycomando ha corrispondenti iuclc, olcuce xcasele impostazioni e un alias per tutti e tre: lcase. L'impostazione predefinita e ciò che ottieni dopo stty saneè lcasedisattivato.

Quindi, quando sei su un VT50, tutto ciò che devi fare è eseguire:

stty lcase

per poter fare qualsiasi cosa. Ma tieni duro, come puoi farlo quando puoi inviare solo lettere maiuscole? Ecco dove è necessario un STTYcomando come alias per stty, ed è per questo che sttysupporta LCASEcome alias per lcase.

Non esiste un tale SANEalias perché non vuoi farlo stty sanequando il tuo terminale è tutto maiuscolo.

Se corri stty lcaseo stty olcucper errore su un terminale normale (provalo xtermo su un terminale moderno), è lì che devi entrare stty saneper tornare alla normalità. Ma non hai bisogno di un STTYcomando per quello. Se si digita stty sane, si avrà vede STTY SANEeco indietro, ma questo è solo il testo visualizzato (non il comando inserito) che sono stati tradotti, è ancora il stty sanecomando che verrà eseguito.

Quelli iuclc, olcuc, xcasebandiere usate da precisare da POSIX (e questo è probabilmente il motivo per cui viene implementato su Linux, anche se dubito seriamente che nessuno mai collegato uno di questi vecchi terminali ad un sistema Linux (diversi da quelli per divertimento)), ma sono stati rimossi in POSIX: 2001.


2

Su Fedora 18 qui:

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

Per un totale di 50 (di cui non sapevo di più).


1
50, ma 25 distinti.
Stéphane Chazelas,

0

Su Debian Sid, con zsh, e ls -1 $path | grep '[A-Z]', capisco

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

Modifica: si noti che, nel comando sopra, questa è la cifra, non la lettera l. Uno come in una colonna.


1
Con zsh, corri:type -m '*[A-Z]*'
Stéphane Chazelas il

@StephaneChazelas: OK, il tuo mostra il percorso di ricerca e include anche funzioni di shell. Ma il mio è anche specifico per zsh: la minuscola $pathnon è in bash, per una volta. Bene, più informazioni, meglio è.
Emanuel Berg,

1
Sì, non ho detto che il tuo era sbagliato, ho solo suggerito un'alternativa (anche se concordo sul fatto che non era il migliore dei termini). Nota che $pathnon è specifico per zsh. Viene da csh/tcshdove funziona anche il tuo comando.
Stéphane Chazelas,

@StephaneChazelas: Ah, è interessante! No, il mio comando non è "sbagliato" ma sono d'accordo che il tuo è meglio perché ha senso includere funzioni e alias della shell. Almeno per me lo fa, perché quando uso il mio computer, non mi interessa se è un file binario, uno script, una funzione, un alias o qualsiasi altra cosa, purché possa eseguirlo e fa il suo lavoro. (Immagino che -msia per "match".)
Emanuel Berg
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.