Um comando Linux pode ter letras maiúsculas? Eu sei que é suportado, mas quero ter certeza se é um "problema" ou considerado "não é uma coisa boa"?
linux
shell
command-line
terdon
fonte
fonte
echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"
produzhello world
como esperado. (Supondo que você~/bin
esteja no seu$PATH
, é claro).Respostas:
Não há restrição para nomes de comandos no Unix. Qualquer arquivo pode ser um comando. E um nome de arquivo pode ser qualquer sequência de um ou mais caracteres (até um limite), exceto ASCII NUL ou ASCII
/
.zsh
até levanta essa limitação para funções nas quais você pode ter qualquer sequência como o nome da função.Algumas notas:
.
ou..
;-).bash
, comozsh
,tcsh
ouksh
). Nesse sentido, os caracteres maiúsculos podem ajudar, pois geralmente não são usados pelos comandos padrão.|
,=
,&
e muitos outros teriam de ser escapou em conchas, se você usar:
, seu comando não pode ser usado como um shell de login ... ) Você pode até excluir.
e-
que não são permitidos em nomes de funções em muitos shells, caso deseje permitir que os usuários agrupem seu comando em uma função shell.zsh
funções dos sistemas de conclusão_
), e comandos com todos os dígitos podem ser um problema em coisas comocmd>output.log
. Os arquivos cujo nome começa com um ponto serão ocultados por itens comols
globbings de shell e muitos gerenciadores de arquivos.fonte
zsh_with_some_funky_option
(em vez deZSH
)?alias .="echo Hello"
.-) (Bem,sudo vim /bin/.
foi mais difícil, embora ...).() echo Hello
. O pdksh também, mas o.
builtin especial tem precedência lá.Sim, pode, e já existem alguns. Tais como
/usr/bin/X
:)Então isso é 758 em todo o Ubuntu 12.04. Lista completa: https://gist.github.com/5264777
fonte
Xdialog
? : o E você deve citargrep
o parâmetro para evitar que o shell o expanda no diretório atual antes da execução.grep
parâmetro 's: pastebin.com/Gak7x9rN (Sim, eu posso editá-lo eu mesmo, mas eu prefiro que você entender o porquê.)bash
meu diretório pessoal na verdade gasta[A-Z]
para "cdfhjmpqrt". Então, caso insensível.zsh
oufailglob
opção do bash . Eu, pessoalmente, normalmente nomear meus arquivos temporários (em~
)a
,b
,c
... e meu diretórios temporáriosA
,B
,C
...O comando mais famoso é
stty
, que também estava disponível comoSTTY
. Foi muito útil colocar o terminal de volta ao comportamento normalSTTY SANE
.fonte
/bin/stty
mas nada mais. Gostaria de elaborar um pouco sua resposta?a
e o terminal veráA
. Para restaurar a sanidade, você usaria ostty sane
comando Exceto que isso agora é impossível, portanto, terstty
disponível comoSTTY
foi muito bem-vindo. Eu nem me lembro a última vez que eu precisava dessa embora :)Algumas notas sobre o
STTY
comando histórico para esclarecer algumas imprecisões na outra resposta e nos comentários associados :Os terminais anteriores, como o DEC VT05 ou VT50 e as tele - impressoras anteriores, eram compatíveis apenas com caracteres maiúsculos. O que isso significava é que nenhum caractere minúsculo poderia ser inserido a partir deles ou que eles não seriam capazes de exibir nenhuma outra letra além das maiúsculas.
Como o Unix faz distinção entre maiúsculas e minúsculas e a maioria dos comandos é minúscula, você pode ver que há um problema lá. É por isso que existem modos especiais termio / termios (e que ainda existem nos Unices modernos, mesmo que esses terminais tenham se esgotado há muito tempo) para lidar com eles.
termio / termios são respectivamente as interfaces mais antigas e mais recentes para controlar o driver tty no Unix. Em um (s) termo (s)
ioctl
, você especifica entrada, saída, sinalizadores de controle ... que especificam como os sinais elétricos em uma linha serial devem ser tratados nos caracteres de entrada e saída e o comportamento interno do driver em coisas como echo, the editor de linha ... A maioria deles se aplica a terminais virtuais, como modernos consoles VGA Unix ou pseudo terminais.A interface da linha de comandos para
termio(s)
é astty
comandoPara lidar com os terminais maiúsculos, há três
termio(s)
sinalizadores envolvidos:IUCLC
(Introduzir maiúsculas em minúsculas): os caracteres recebidos são convertidos em minúsculas quando são introduzidos. Isso significa que oA
enviado pelo terminal é considerado como aa
. Isso significa que com este, eu posso agora escreverLS
no meu VT50, eo shell vai lerls
a partir/dev/ttyX
. Agora também posso executar ostty
comandoIUCLC
sozinho e terminalecho
, enquanto digitoLS
, o driver envia dels
volta para o terminal (para que eu possa ver o que digito) que ele não pode exibir, então também precisamosOLCUC
(Saída em minúscula para maiúscula), ou seja precisamos converter qualquer letra minúscula em maiúscula antes de enviar para o terminal.xcase
local . Isso permite (apenas no modo de entrada canônica) enviar uma maiúsculaA
digitando\A
e, na saída, uma maiúsculaA
é renderizada como\A
. (aquele não está implementado no Linux)O
stty
comando tem os correspondentesiuclc
,olcuc
excase
configurações e um alias para todos os três:lcase
. A configuração padrão e o que você procurastty sane
estãolcase
desativados.Portanto, quando você está em um VT50, tudo o que você precisa fazer é executar:
ser capaz de fazer qualquer coisa. Mas espere, como você faz isso quando só pode enviar letras maiúsculas? É aí que você precisa de um
STTY
comando como um alias parastty
, e é por isso questty
suportaLCASE
como um alias paralcase
.Não existe um
SANE
pseudônimo porque você não deseja fazer issostty sane
quando o seu terminal está em maiúsculas.Se você executar
stty lcase
oustty olcuc
por engano em um terminal normal (experimentexterm
ou em qualquer terminal moderno), é aí que você precisa entrarstty sane
para voltar ao normal. Mas você não precisa de umSTTY
comando para isso. Se você digitarstty sane
, você vai verSTTY SANE
ecoou de volta, mas isso é apenas o texto exibido (não o comando inserido) que foram traduzidos, ainda o éstty sane
comando que será executado.Aqueles
iuclc
,olcuc
,xcase
bandeiras costumava ser especificado por POSIX (e isso é provavelmente por isso que ele é implementado no Linux, embora eu duvido seriamente que alguém já conectado qualquer daqueles velhos terminais para um sistema Linux (exceto por diversão)), mas foram removidos em POSIX: 2001.fonte
No Fedora 18 aqui:
Para um total de 50 (dos quais eu não conhecia mais).
fonte
No Debian sid, com zsh, e
ls -1 $path | grep '[A-Z]'
eu receboEdit: Observe que, no comando acima, esse é o dígito, não a letra
l
. Um como em uma coluna.fonte
zsh
, corra:type -m '*[A-Z]*'
$path
não estão no bash, pela primeira vez. Bem, quanto mais informações, melhor.$path
não é específico do zsh. Ele vem decsh/tcsh
onde seu comando também funciona.-m
é para "jogo".)