¿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".
linux
shell
command-line
terdon
fuente
fuente

echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"producehello worldcomo se esperaba. (Suponiendo que~/binestá en su$PATH, por supuesto).Respuestas:
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:
.o..;-).bash,zsh,tcshoksh). En ese sentido, los caracteres en mayúscula pueden ayudar, ya que generalmente no son utilizados por comandos estándar.|,=,&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.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 comocmd>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.fuente
zsh_with_some_funky_option(en lugar deZSH)?alias .="echo Hello") (Bueno,sudo vim /bin/.fue más difícil, sin embargo ...).() echo Hello. También lo hace pdksh, pero la.construcción especial tiene prioridad allí.Sí puede, y ya hay algunos. Como
/usr/bin/X:)Eso es 758 en todo Ubuntu 12.04. Lista completa: https://gist.github.com/5264777
fuente
Xdialog? : o Y debe citargrepel parámetro para evitar que el shell lo expanda en el directorio actual antes de la ejecución.grepel parámetro: pastebin.com/Gak7x9rN (Sí, puedo editarlo yo mismo, pero prefiero que entiendan por qué.)bashen mi directorio de inicio realmente se gasta[A-Z]en "cdfhjmpqrt". Entonces caso insensible.zshlafailglobopción de bash . Yo personalmente suele nombrar a mis archivos temporales (en~)a,b,c... y mi directorios temporalesA,B,C...El comando más famoso es
stty, que también estaba disponible comoSTTY. Fue muy útil volver a configurar el terminal a su comportamiento normalSTTY SANE.fuente
/bin/sttypero nada más. ¿Te importaría elaborar un poco tu respuesta?ay la terminal veríaA. Para restaurar la cordura, usaría elstty sanecomando. Excepto que esto ahora es imposible, por lo tanto tenersttydisponible comoSTTYfue muy bienvenido. Sin embargo, ni siquiera recuerdo la última vez que necesité esto :)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 elsttycomando.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 elAenviado por el terminal se considera como aa. Eso significa que con este, yo ahora puedo escribirLSen mi VT50, y la cáscara a leerlsa partir/dev/ttyX. Ahora también puedo ejecutar elsttycomando.IUCLCsolo y terminalecho, mientras escriboLS, el controlador enviaría delsvuelta al terminal (para que yo pueda ver lo que escribo) que no puede mostrar, por lo que también necesitamosOLCUC(Salida minúscula a mayúscula), eso es necesitamos convertir cualquier letra minúscula a mayúscula antes de enviarla a la terminal.xcaselocal . Esto permite (solo en modo de entrada canónica) enviar una mayúsculaAescribiendo\A, y en la salida, una mayúsculaAse representa como\A. (ese no está implementado en Linux)El
sttycomando dispone de los correspondientesiuclc,olcucyxcaselos ajustes y un alias para los tres:lcase. La configuración predeterminada y lo que obtienes despuésstty saneestálcasedesactivado.Entonces, cuando estás en un VT50, todo lo que necesitas hacer es ejecutar:
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 aliasstty, y es por eso questtyadmiteLCASEcomo alias paralcase.No existe ese
SANEalias porque no desea hacerlostty sanecuando su terminal está en mayúsculas.Si ejecuta
stty lcaseostty olcucpor error en un terminal normal (pruébeloxtermo en cualquier terminal moderno), allí es donde debe ingresarstty sanepara volver a la normalidad. Pero no necesitas unSTTYcomando para eso. Si escribestty sane, que se veSTTY 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 elstty 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.fuente
En Fedora 18 aquí:
Para un total de 50 (de los cuales no sabía más).
fuente
En Debian sid, con zsh, y
ls -1 $path | grep '[A-Z]'obtengoEditar: Tenga en cuenta que, en el comando anterior, ese es el dígito uno, no la letra
l. Uno como en una columna.fuente
zsh, corre:type -m '*[A-Z]*'$pathno están en bash, por una vez. Bueno, cuanta más información, mejor.$pathno es específico de zsh. Viene decsh/tcshdonde su comando también funciona.-mes para "partido".)