¿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 world
como se esperaba. (Suponiendo que~/bin
está 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
/
.zsh
incluso 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
,tcsh
oksh
). 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.zsh
las 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,ls
los 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 citargrep
el parámetro para evitar que el shell lo expanda en el directorio actual antes de la ejecución.grep
el parámetro: pastebin.com/Gak7x9rN (Sí, puedo editarlo yo mismo, pero prefiero que entiendan por qué.)bash
en mi directorio de inicio realmente se gasta[A-Z]
en "cdfhjmpqrt". Entonces caso insensible.zsh
lafailglob
opció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/stty
pero nada más. ¿Te importaría elaborar un poco tu respuesta?a
y la terminal veríaA
. Para restaurar la cordura, usaría elstty sane
comando. Excepto que esto ahora es imposible, por lo tanto tenerstty
disponible comoSTTY
fue muy bienvenido. Sin embargo, ni siquiera recuerdo la última vez que necesité esto :)Algunas notas sobre el
STTY
comando 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 elstty
comando.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 elA
enviado por el terminal se considera como aa
. Eso significa que con este, yo ahora puedo escribirLS
en mi VT50, y la cáscara a leerls
a partir/dev/ttyX
. Ahora también puedo ejecutar elstty
comando.IUCLC
solo y terminalecho
, mientras escriboLS
, el controlador enviaría dels
vuelta 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.xcase
local . Esto permite (solo en modo de entrada canónica) enviar una mayúsculaA
escribiendo\A
, y en la salida, una mayúsculaA
se representa como\A
. (ese no está implementado en Linux)El
stty
comando dispone de los correspondientesiuclc
,olcuc
yxcase
los ajustes y un alias para los tres:lcase
. La configuración predeterminada y lo que obtienes despuésstty sane
estálcase
desactivado.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
STTY
comando como aliasstty
, y es por eso questty
admiteLCASE
como alias paralcase
.No existe ese
SANE
alias porque no desea hacerlostty sane
cuando su terminal está en mayúsculas.Si ejecuta
stty lcase
ostty olcuc
por error en un terminal normal (pruébeloxterm
o en cualquier terminal moderno), allí es donde debe ingresarstty sane
para volver a la normalidad. Pero no necesitas unSTTY
comando para eso. Si escribestty sane
, que se veSTTY SANE
hecho 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 sane
comando que se ejecutará.Aquellos
iuclc
,olcuc
,xcase
banderas 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]*'
$path
no están en bash, por una vez. Bueno, cuanta más información, mejor.$path
no es específico de zsh. Viene decsh/tcsh
donde su comando también funciona.-m
es para "partido".)