Um comando do Linux pode ter letra maiúscula (s)?

15

Um comando do Linux pode ter letras maiúsculas? Eu sei que é suportado, mas eu quero ter certeza se é um "problema" ou "não é uma coisa boa"?

    
por terdon 28.03.2013 / 17:26

6 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 (até um limite) de caracteres diferentes de ASCII NUL ou ASCII / . zsh eleva essa limitação para funções onde você pode ter qualquer string como o nome da função.

Algumas notas:

  • você terá dificuldade em criar um arquivo de comando chamado . ou .. ; -).
  • evite nomes que já tenham sido usados por comandos padrão ou por constraints de shell ou palavras-chave (pelo menos dos shells mais comuns, como bash , zsh , tcsh ou ksh ). A esse respeito, caracteres maiúsculos podem ajudar, pois geralmente não são usados por 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 que estão por aí
  • enquanto estiver nisso, restrinja-se a letras, dígitos, traço, ponto e sublinhado. Qualquer outra coisa, embora legal, pode causar um problema ou outro com essa ou aquela ferramenta (por exemplo, | , = , & e muitos outros precisariam ser escapados em shells, se você usar : , seu comando não pode ser usado como shell de login ...). Você pode até querer excluir . e - , que não são permitidos em nomes de função em muitos shells, caso você queira permitir que os usuários envolvam seu comando em uma função do shell.
  • Transforme o primeiro caractere em uma letra. Mais uma vez, não é um requisito rigoroso. Mas sublinhado às vezes é usado para coisas especiais (como em zsh as funções dos sistemas de conclusão começam com _ ), e comandos de todos os dígitos podem ser um problema em coisas como cmd>output.log . Os arquivos cujo nome começa com um ponto ficarão ocultos por itens como ls ou shell globbings e muitos gerenciadores de arquivos.
por 28.03.2013 / 22:55
27

Sim, pode e já existem alguns. 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 são 758 no Ubuntu 12.04. Lista completa: link

    
por 28.03.2013 / 17:32
4

Algumas notas sobre o comando histórico STTY para esclarecer algumas imprecisões na outra resposta e comentários associados :

Terminais anteriores como o DEC VT05 ou VT50 e os teleimpressores antes disso apenas suportavam caracteres maiúsculos. O que isso significa é que nenhum caractere em letra minúscula jamais poderia ser inserido a partir deles ou que eles não seriam capazes de exibir qualquer outra letra que não os maiúsculos.

Com o Unix sendo sensível a maiúsculas e a maioria dos comandos sendo minúsculas, você pode ver que há um problema. É por isso que existem modos especiais termio / termios (e que ainda estão lá nos Unices modernos, mesmo que esses terminais tenham ido há muito tempo) para lidar com isso.

termio / termios são respectivamente as interfaces mais antigas e mais recentes para controlar o driver tty no Unix. Em um termio (s) ioctl , você especifica sinais de entrada, saída, controle ... que especificam como os sinais elétricos em uma linha serial devem ser manipulados em caracteres de entrada e saída e o comportamento interno do driver. echo, o editor de linhas ... A maioria deles se aplica a terminais virtuais, como os modernos consoles Unix VGA ou pseudo-terminais.

A interface da linha de comando para termio(s) é o comando stty .

Para manipular os terminais de maiúsculas, há três termio(s) de sinalizadores envolvidos:

  • IUCLC (Maiúsculas para minúsculas): os caracteres recebidos são convertidos para minúsculas quando são inseridos. Isso significa que o A enviado pelo terminal é considerado como a . Isso significa que, com isso ativado, posso digitar LS no meu VT50, e o shell lerá ls de /dev/ttyX . Eu também posso agora executar o comando stty .
  • Agora, com IUCLC sozinho e terminal echo , enquanto digito LS , o driver enviava ls de volta para o terminal (para que eu possa ver o que digito) que ele não pode exibir, então também precisamos de OLCUC (Minúscula de Saída para Maiúsculas), ou seja, precisamos converter qualquer letra minúscula para 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 (somente no modo de entrada canônico) enviar uma maiúscula A digitando \A e, na saída, uma maiúscula A é processado como \A . (aquele não está implementado no Linux)

O comando stty tem as configurações iuclc , olcuc e xcase correspondentes e um alias para todos os três: lcase . A configuração padrão e o que você obtém depois de stty sane é lcase off.

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

stty lcase

para poder fazer qualquer coisa. Mas espere, como você faz isso quando só pode enviar letras maiúsculas? É aí que você precisa de um comando STTY como um alias para stty , e é por isso que stty suporta LCASE como um alias para lcase .

Não existe tal SANE alias porque você não quer fazer stty sane quando seu terminal é todo em maiúsculas.

Se você executar stty lcase ou stty olcuc por engano em um terminal normal (experimente em xterm ou qualquer terminal moderno), é aí que você precisa inserir stty sane para voltar ao normal. Mas você não precisa de um comando STTY para isso. Se você digitar stty sane , irá ver STTY SANE retornado, mas esse é apenas o texto exibido (não o comando digitado) que terá sido traduzido, ainda é o comando stty sane que será ser executado.

Esses iuclc , olcuc , xcase flags costumavam ser especificados pelo POSIX (e é provavelmente por isso que ele é implementado no Linux, embora eu duvide seriamente que alguém já conectou qualquer um desses terminais antigos a um sistema Linux ( diferente de diversão)), mas foram removidos no POSIX: 2001.

    
por 29.03.2013 / 23:02
3

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

    
por 28.03.2013 / 23:37
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 sabia mais).

    
por 28.03.2013 / 18:49
0

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

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

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

    
por 29.03.2013 / 11:24