¿Puede un comando de Linux tener mayúscula (s)?

17

¿Puede un comando de Linux tener mayúscula (s)? Sé que es compatible, pero quiero estar seguro de si es un "problema" o si se considera "no es algo bueno".

terdon
fuente
66
La convención de UNIX es usar minúsculas para los nombres de los comandos, pero puede llamarlos como desee.
1
De hecho, a UNIX no le importa lo que llames tus comandos. Causará mucho dolor y sufrimiento, pero incluso puede tener comandos con espacios en ellos: echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"produce hello worldcomo se esperaba. (Suponiendo que ~/binestá en su $PATH, por supuesto).
derobert
Mira esta pregunta y mi tutorial quizás demasiado largo .
Emanuel Berg

Respuestas:

13

No hay restricción en los nombres de comandos en Unix. Cualquier archivo puede ser un comando. Y un nombre de archivo puede ser cualquier secuencia de uno o más (hasta un límite) de caracteres distintos de ASCII NUL o ASCII /. zshincluso levanta esa limitación para las funciones donde puede tener cualquier cadena como nombre de la función.

Algunas notas sin embargo:

  • tendrá dificultades para crear un archivo de comando llamado .o ..;-).
  • nombres de evitar que ya se toman por comandos estándar o builtins shell o palabras clave (por lo menos de la mayoría de las cáscaras comunes como bash, zsh, tcsho ksh). En ese sentido, los caracteres en mayúscula pueden ayudar, ya que generalmente no son utilizados por comandos estándar.
  • Es mejor restringir a caracteres ASCII. Los caracteres no ASCII no se expresan de la misma manera en los distintos juegos de caracteres que existen
  • mientras lo hace, limítese a letras, dígitos, guiones, puntos y guiones bajos. Cualquier otra cosa, mientras jurídica, puede causar un problema u otro con tal o cual herramienta (por ejemplo, |, =, &y muchos otros tendría que ser librado en conchas, si se utiliza :, el comando no puede utilizarse como de un shell de entrada ... ) Es posible que incluso desee excluir .y -que no están permitidos en los nombres de funciones en muchos shells, en caso de que desee permitir que los usuarios envuelvan su comando en una función de shell.
  • Haz que el primer personaje sea una letra. De nuevo, no es un requisito estricto. Pero el guión bajo a veces se usa para cosas especiales (como en zshlas funciones desde las que comienzan los sistemas de terminación _), y los comandos de todos los dígitos pueden ser un problema en cosas como cmd>output.log. Los archivos cuyo nombre comience con un punto estarán ocultos por cosas como, por ejemplo, lslos globos de shell y muchos administradores de archivos.
Stéphane Chazelas
fuente
Correcto. Así que supongo que todo se reduce a, no uses nada fuera de lo común a menos que tengas una buena razón para hacerlo. Incluso su segundo punto, no creo que usar mayúsculas para cubrir esos shells sea tan inteligente, ¿no es mejor nombrar el comando para describir el cambio? ¿Como zsh_with_some_funky_option(en lugar de ZSH)?
Emanuel Berg
¿Es alias un comando? Porque si es así, me fue muy fácil escribir. alias .="echo Hello") (Bueno, sudo vim /bin/.fue más difícil, sin embargo ...)
Alois Mahdal
@AloisMahdal Por eso dije archivo de comandos . zsh también permite .() echo Hello. También lo hace pdksh, pero la .construcción especial tiene prioridad allí.
Stéphane Chazelas
Vaya, mi
error de lectura
27

Sí puede, y ya hay algunos. Como /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

Eso es 758 en todo Ubuntu 12.04. Lista completa: https://gist.github.com/5264777

Dennis Kaarsemaker
fuente
No Xdialog? : o Y debe citar grepel parámetro para evitar que el shell lo expanda en el directorio actual antes de la ejecución.
manatwork
No lo tengo instalado en este sistema :)
Dennis Kaarsemaker
2
Me gustaría insistir en citar grepel parámetro: pastebin.com/Gak7x9rN (Sí, puedo editarlo yo mismo, pero prefiero que entiendan por qué.)
manatwork
1
Bueno, también puede depender de la cáscara. Utilicé mayúsculas en mi ejemplo para la portabilidad, pero bashen mi directorio de inicio realmente se gasta [A-Z]en "cdfhjmpqrt". Entonces caso insensible.
manatwork
1
Sin mencionar zshla failglobopción de bash . Yo personalmente suele nombrar a mis archivos temporales (en ~) a, b, c... y mi directorios temporales A, B, C...
Stéphane Chazelas
4

El comando más famoso es stty, que también estaba disponible como STTY. Fue muy útil volver a configurar el terminal a su comportamiento normal STTY SANE.

ott--
fuente
Tengo /bin/sttypero nada más. ¿Te importaría elaborar un poco tu respuesta?
Emanuel Berg
2
En los viejos tiempos, era posible que su terminal se arruinara tanto que todo fuera mayúscula. Entonces escriba ay la terminal vería A. Para restaurar la cordura, usaría el stty sanecomando. Excepto que esto ahora es imposible, por lo tanto tener sttydisponible como STTYfue muy bienvenido. Sin embargo, ni siquiera recuerdo la última vez que necesité esto :)
Dennis Kaarsemaker
@DennisKaarsemaker: ¡GUAU! ¡Esa es una buena parte de la historia!
Emanuel Berg
1
Chicos (ott-- y @DennisKaarsemaker), lo tienen al revés. He publicado otra respuesta para aclarar.
Stéphane Chazelas
4

Algunas notas sobre el STTYcomando histórico para aclarar algunas imprecisiones en la otra respuesta y comentarios asociados :

Los terminales anteriores como el DEC VT05 o VT50 y las teleimpresoras anteriores solo admitían caracteres en mayúsculas. Lo que eso significa es que no se puede ingresar ningún carácter en minúsculas o que no podrían mostrar ninguna otra letra que las mayúsculas.

Unix distingue entre mayúsculas y minúsculas y la mayoría de los comandos son minúsculas, puede ver que hay un problema allí. Es por eso que hay modos termio / termios especiales (y que todavía están allí en los Unices modernos a pesar de que esos terminales ya no existen) para manejarlos.

termio / termios son respectivamente las interfaces más antiguas y más nuevas para controlar el controlador tty en Unix. En un término (s) ioctl, especifica entradas, salidas, indicadores de control ... que especifican cómo las señales eléctricas en una línea en serie se deben manejar en caracteres de entrada y salida y el comportamiento interno del controlador wrt cosas como eco, el editor de línea ... La mayoría de ellos se aplican a terminales virtuales como las modernas consolas Unix VGA o pseudo terminales.

La interfaz de línea de comando termio(s)es el sttycomando.

Para manejar los terminales de mayúsculas, hay tres termio(s)banderas involucradas:

  • IUCLC(Ingresar mayúsculas a minúsculas): los caracteres entrantes se convierten a minúsculas cuando se ingresan. Eso significa que el Aenviado por el terminal se considera como a a. Eso significa que con este, yo ahora puedo escribir LSen mi VT50, y la cáscara a leer lsa partir /dev/ttyX. Ahora también puedo ejecutar el sttycomando.
  • Ahora, con IUCLCsolo y terminal echo, mientras escribo LS, el controlador enviaría de lsvuelta al terminal (para que yo pueda ver lo que escribo) que no puede mostrar, por lo que también necesitamos OLCUC(Salida minúscula a mayúscula), eso es necesitamos convertir cualquier letra minúscula a mayúscula antes de enviarla a la terminal.
  • Ahora, podemos operar Unix desde un VT50, pero ¿qué pasa si queremos ingresar caracteres en mayúsculas ahora? Ahí es donde entra la bandera xcase local . Esto permite (solo en modo de entrada canónica) enviar una mayúscula Aescribiendo \A, y en la salida, una mayúscula Ase representa como \A. (ese no está implementado en Linux)

El sttycomando dispone de los correspondientes iuclc, olcucy xcaselos ajustes y un alias para los tres: lcase. La configuración predeterminada y lo que obtienes después stty saneestá lcasedesactivado.

Entonces, cuando estás en un VT50, todo lo que necesitas hacer es ejecutar:

stty lcase

para poder hacer cualquier cosa. Pero espera, ¿cómo haces eso cuando solo puedes enviar letras mayúsculas? Ahí es donde necesita un STTYcomando como alias stty, y es por eso que sttyadmite LCASEcomo alias para lcase.

No existe ese SANEalias porque no desea hacerlo stty sanecuando su terminal está en mayúsculas.

Si ejecuta stty lcaseo stty olcucpor error en un terminal normal (pruébelo xtermo en cualquier terminal moderno), allí es donde debe ingresar stty sanepara volver a la normalidad. Pero no necesitas un STTYcomando para eso. Si escribe stty sane, que se ve STTY SANEhecho eco de vuelta, pero eso es sólo el texto que se muestra (no a la orden introducida) que se han traducido, que sigue siendo el stty sanecomando que se ejecutará.

Aquellos iuclc, olcuc, xcasebanderas solía ser especificado por POSIX (y probablemente por eso se implementa en Linux, aunque tengo serias dudas de alguien alguna vez conectado cualquiera de esas viejas terminales a un sistema Linux (que no sean para la diversión)), pero se han eliminado en POSIX: 2001.

Stéphane Chazelas
fuente
2

En Fedora 18 aquí:

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

Para un total de 50 (de los cuales no sabía más).

vonbrand
fuente
1
50, pero 25 distintos.
Stéphane Chazelas
0

En Debian sid, con zsh, y ls -1 $path | grep '[A-Z]'obtengo

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

Editar: Tenga en cuenta que, en el comando anterior, ese es el dígito uno, no la letra l. Uno como en una columna.

Emanuel Berg
fuente
1
Con zsh, corre:type -m '*[A-Z]*'
Stéphane Chazelas
@StephaneChazelas: OK, el tuyo muestra la ruta de búsqueda y también incluye funciones de shell. Pero el mío también es específico de zsh: las minúsculas $pathno están en bash, por una vez. Bueno, cuanta más información, mejor.
Emanuel Berg
1
Sí, no dije que el tuyo estaba mal, solo sugerí una alternativa (aunque estaría de acuerdo en que no era la mejor redacción). Tenga en cuenta que $pathno es específico de zsh. Viene de csh/tcshdonde su comando también funciona.
Stéphane Chazelas
@StephaneChazelas: ¡Ajá, eso es interesante! No, mi comando no es "incorrecto", pero acepto que el suyo es mejor porque tiene sentido incluir alias y funciones de shell. Al menos para mí lo hace, porque cuando uso mi computadora, no me importa si es un binario, un script, una función, un alias o lo que sea, siempre que pueda ejecutarlo y haga su trabajo. (Supongo que -mes para "partido".)
Emanuel Berg