Um comando Linux pode ter letras maiúsculas?

17

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"?

terdon
fonte
6
A convenção do UNIX é usar letras minúsculas para nomes de comandos, mas você pode chamá-los como quiser.
1
De fato, o UNIX não se importa com o que você chama de comandos. Causará muita dor e sofrimento, mas você pode até ter comandos com espaços neles: echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"produz hello worldcomo esperado. (Supondo que você ~/binesteja no seu $PATH, é claro).
31413 derobert
Confira esta pergunta e meu tutorial talvez muito longo .
Emanuel Berg

Respostas:

13

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 /. zshaté levanta essa limitação para funções nas quais você pode ter qualquer sequência como o nome da função.

Algumas notas:

  • será difícil criar um arquivo de comando chamado .ou ..;-).
  • evite nomes que já sejam usados ​​por comandos padrão ou por componentes ou palavras-chave do shell (pelo menos os shells mais comuns bash, como zsh, tcshou ksh). Nesse sentido, os caracteres maiúsculos podem ajudar, pois geralmente não são usados ​​pelos comandos padrão.
  • É melhor restringir a caracteres ASCII. Caracteres não ASCII não são expressos da mesma forma nos vários conjuntos de caracteres existentes
  • enquanto estiver nisso, restrinja-se a letras, dígitos, traço, ponto e sublinhado. Qualquer outra coisa, enquanto legal, pode causar um problema ou outro com esta ou aquela ferramenta (por exemplo, |, =, &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.
  • Faça do primeiro caractere uma letra. Novamente, não é um requisito estrito. Às vezes, porém, o sublinhado é usado para coisas especiais (como nas zshfunções dos sistemas de conclusão _), e comandos com todos os dígitos podem ser um problema em coisas como cmd>output.log. Os arquivos cujo nome começa com um ponto serão ocultados por itens como lsglobbings de shell e muitos gerenciadores de arquivos.
Stéphane Chazelas
fonte
Certo. Então, acho que tudo se resume a, não use nada fora do comum, a menos que você tenha um bom motivo para fazê-lo. Mesmo seu segundo ponto, não acho que usar letras maiúsculas para cobrir essas conchas seja tão inteligente - não é melhor nomear o comando para descrever a alteração? Tipo zsh_with_some_funky_option(em vez de ZSH)?
Emanuel Berg
O alias é um comando? Porque se sim, eu tinha muito fácil tempo digitando alias .="echo Hello".-) (Bem, sudo vim /bin/.foi mais difícil, embora ...)
Alois Mahdal
@AloisMahdal Foi por isso que eu disse arquivo de comando . O zsh também permite .() echo Hello. O pdksh também, mas o .builtin especial tem precedência lá.
Stéphane Chazelas 29/03
Opa, o meu mal interpretado ... ponto interessante sobre as precedências pdksh, embora ...
Alois Mahdal
27

Sim, pode, e já existem alguns. Tais 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

Então isso é 758 em todo o Ubuntu 12.04. Lista completa: https://gist.github.com/5264777

Dennis Kaarsemaker
fonte
Não Xdialog? : o E você deve citar grepo parâmetro para evitar que o shell o expanda no diretório atual antes da execução.
28413 manatwork
Não tê-lo instalado neste sistema :)
Dennis Kaarsemaker
2
Gostaria de insistir em citar grepparâmetro 's: pastebin.com/Gak7x9rN (Sim, eu posso editá-lo eu mesmo, mas eu prefiro que você entender o porquê.)
manatwork
1
Bem, isso também pode depender do shell. Usei letras maiúsculas no meu exemplo para portabilidade, mas o bashmeu diretório pessoal na verdade gasta [A-Z]para "cdfhjmpqrt". Então, caso insensível.
manatwork
1
Sem mencionar zshou failglobopção do bash . Eu, pessoalmente, normalmente nomear meus arquivos temporários (em ~) a, b, c... e meu diretórios temporários A, B, C...
Stéphane Chazelas
4

O comando mais famoso é stty, que também estava disponível como STTY. Foi muito útil colocar o terminal de volta ao comportamento normal STTY SANE.

ott--
fonte
Eu tenho /bin/sttymas nada mais. Gostaria de elaborar um pouco sua resposta?
Emanuel Berg
2
Nos bons velhos tempos, era possível que o seu terminal estivesse tão ferrado que tudo estava em maiúsculas. Então digite ae o terminal verá A. Para restaurar a sanidade, você usaria o stty sanecomando Exceto que isso agora é impossível, portanto, ter sttydisponível como STTYfoi muito bem-vindo. Eu nem me lembro a última vez que eu precisava dessa embora :)
Dennis Kaarsemaker
@DennisKaarsemaker: WOW! Isso é um pedaço legal da história!
Emanuel Berg
1
Pessoal (ott-- e @DennisKaarsemaker), você tem isso ao contrário. Publiquei outra resposta para esclarecimento.
Stéphane Chazelas 29/03
4

Algumas notas sobre o STTYcomando 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 comando

Para 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 o Aenviado pelo terminal é considerado como a a. Isso significa que com este, eu posso agora escrever LSno meu VT50, eo shell vai ler lsa partir /dev/ttyX. Agora também posso executar o sttycomando
  • Agora, com IUCLCsozinho e terminal echo, enquanto digito LS, o driver envia de lsvolta para o terminal (para que eu possa ver o que digito) que ele não pode exibir, então também precisamos OLCUC(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.
  • Agora, podemos operar o Unix a partir de um VT50, mas e se quisermos inserir caracteres maiúsculos agora? É aí que entra o sinalizador xcase local . Isso permite (apenas no modo de entrada canônica) enviar uma maiúscula Adigitando \Ae, na saída, uma maiúscula Aé renderizada como \A. (aquele não está implementado no Linux)

O sttycomando tem os correspondentes iuclc, olcuce xcaseconfigurações e um alias para todos os três: lcase. A configuração padrão e o que você procura stty saneestão lcasedesativados.

Portanto, quando você está em um VT50, tudo o que você precisa fazer é executar:

stty lcase

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 STTYcomando como um alias para stty, e é por isso que sttysuporta LCASEcomo um alias para lcase.

Não existe um SANEpseudônimo porque você não deseja fazer isso stty sanequando o seu terminal está em maiúsculas.

Se você executar stty lcaseou stty olcucpor engano em um terminal normal (experimente xtermou em qualquer terminal moderno), é aí que você precisa entrar stty sanepara voltar ao normal. Mas você não precisa de um STTYcomando para isso. Se você digitar stty sane, você vai ver STTY SANEecoou 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, xcasebandeiras 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.

Stéphane Chazelas
fonte
2

No Fedora 18 aqui:

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 um total de 50 (dos quais eu não conhecia mais).

vonbrand
fonte
1
50, mas 25 distintos.
Stéphane Chazelas 29/03
0

No Debian sid, com zsh, e ls -1 $path | grep '[A-Z]'eu recebo

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

Edit: Observe que, no comando acima, esse é o dígito, não a letra l. Um como em uma coluna.

Emanuel Berg
fonte
1
Com zsh, corra:type -m '*[A-Z]*'
Stéphane Chazelas 29/03
@StephaneChazelas: OK, o seu exibe o caminho de pesquisa e também inclui funções de shell. Mas o meu também é específico do zsh: minúsculas $pathnão estão no bash, pela primeira vez. Bem, quanto mais informações, melhor.
Emanuel Berg
1
Sim, eu não disse que o seu estava errado, apenas sugeri uma alternativa (embora eu concorde que não foi o melhor dos termos). Observe que $pathnão é específico do zsh. Ele vem de csh/tcshonde seu comando também funciona.
Stéphane Chazelas
@StephaneChazelas: Aha, isso é interessante! Não, meu comando não está "errado", mas concordo que o seu é melhor porque faz sentido incluir funções e aliases de shell. Pelo menos para mim, porque quando uso meu computador, não me importo se é um binário, um script, uma função, um apelido ou o que for, desde que eu possa executá-lo e fazer seu trabalho. (Acho que o -mé para "jogo".)
Emanuel Berg