Eu me deparei com este comando durante a configuração ssh
:
$ w
20:01:30 up 6 days, 2:20, 3 users, load average: 0.06, 0.11, 0.10
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
rick tty7 :0 16Jun20 6days 16:51 2.37s /sbin/upstart --user
rick pts/21 192.168.0.12 18:44 1:14m 0.19s 0.00s sleep 60
rick pts/22 192.168.0.12 18:45 0.00s 0.44s 0.01s w
O que me levou a imaginar quais são todos os comandos de uma letra no Ubuntu. Não encontrei uma referência exata, mas encontrei este site:
Aqui o w
comando é listado junto com:
.
o comando para originar um arquivo que eu useiv
é um comando não instalado no Ubuntu. Diz-se que é equivalente als -l -b
. Isso, por sua vez, é semelhante àll
configuração do alias pelo Ubuntu, exceto que os arquivos que começam com.
(incluindo o infame.
e..
) não são incluídos.
Existem outros comandos de uma letra instalados no Ubuntu por padrão?
TL;DR : Isso informa sobre cada comando cujo nome é um único caractere, embora você queira simplificá-lo ou ajustá-lo:
Listando comandos de um caractere com
compgen
O Bash tem preenchimento de tabulação e oferece um
compgen
built-in, que fornece informações sobre como o texto é concluído. Ao executarcompgen -c
, você pode listar todos os comandos em seu sistema. Portanto, uma maneira de listar todos os comandos com apenas um caractere é filtrar a saída decompgen -c
:Como o steeldriver apontou ,
compgen
aceita a opção de-X
fazer sua própria filtragem. De forma um pouco não intuitiva, o operando to-X
é um padrão cujas correspondências são removidas . Ele suporta sintaxe globbing que funciona como expansão de nome de arquivo, mas também suporta uma inicial!
para negá-la, alcançando o efeito desejado aqui. (Consulte Programmable Completion Builtins para obter mais informações sobre a sintaxe.)?
corresponde a qualquer caractere único, portanto,!?
corresponde a qualquer coisa que não seja um único caractere, portanto,-X '!?'
remove tudo o que não é um único caractere, deixando apenas comandos de caractere único:Isso mostra os mesmos resultados, na mesma ordem, que a tubulação para
grep
. Você pode passar-c
e-X
em um argumento como-cX
ou (como o steeldriver mostra ) em dois argumentos como-c -X
.No meu sistema, recebo:
s
et
no meu sistema estão os scripts que escrevi; você provavelmente não tem comandos com esses nomes. Você provavelmente tem os outros.Se estes são realmente comandos ou não, depende do que se pensa como um comando.
{
,}
e!
são palavras- chave shell , comoif
,case
,while
efor
. Os outros (incluindo shell builtins) são comandos inequivocamente no sentido usual.O significado de resultados repetidos
Alguns comandos, como
[
na saída acima, podem ser repetidos. Isso acontece quando existe mais de um comando com o mesmo nome. O Bash oferece[
como um shell embutido, mas também é um executável localizado em/usr/bin
. Running mostra que tipo de comando é e, se for um comando externo, onde está localizado. Quando há mais de um comando com o mesmo nome, mostra aquele que realmente será utilizado. Como Kulfy apontou , você pode ver todos eles usando .type cmd
cmd
type -a cmd
Há outra fonte de possível duplicação: em alguns sistemas,
/bin
e/usr/bin
na verdade são o mesmo diretório (mais precisamente:/bin
é um link simbólico para/usr/bin
) e você verá entradas em/bin
e/usr/bin
. Por exemplo, você pode ter tanto/bin/[
e/usr/bin/[
como o[
interno, bem como ambos/bin/w
e/usr/bin/w
e ambos/bin/X
e/usr/bin/X
. Estes são comandos tecnicamente separados, mas na verdade se referem ao mesmo executável.Tradicionalmente,
/bin
e/usr/bin
eram diretórios separados (para que os comandos/bin
fossem utilizáveis mesmo quando/usr
é um volume NFS que ainda não está montado). Mas hoje em dia isso não costuma oferecer um benefício. Assim, os sistemas mais novos tendem a unificá-los. Se você estiver usando uma versão mais recente, provavelmente terá isso, a menos que tenha atualizado para ela de uma versão mais antiga que não tinha o .Se desejar, você pode classificar a saída
compgen
e remover duplicatas:Mostrando detalhes sobre todos os comandos
Para mais detalhes, você pode querer saber que tipo de comando é cada um e:
Como mencionado acima, o built-in do Bash
type
lhe dirá tudo isso. Você pode escrever um comando que forneça a saída filtrada decompgen
paratype
.Isso vai se comportar mal se você tiver um comando
*
ou .?
Isso é bastante improvável, mas não impossível. Para se proteger contra isso, você pode desabilitar o globbing:Mas isso (com qualquer uma dessas quatro alternativas) é imperfeito, porque todos os comandos com o mesmo nome têm a mesma explicação, o que é correto apenas para o primeiro. Por exemplo, no meu sistema, recebo:
Você pode muito bem querer ver apenas informações sobre a primeira ocorrência de cada comando com o mesmo nome (por exemplo, o shell embutido
[
). Afinal, esses são os que realmente são executados, quando você escreve um comando cuja primeira palavra é qualquer um desses nomes de um caractere (por exemplo,[ -f /bin/nano ]
executa o shell embutido[
, não/usr/bin/[
). Nesse caso, você pode classificar a saídacompgen
e remover duplicatas antes de entregar os resultados paratype
:Ou, também para proteger contra globbing:
No entanto, se você quiser informações sobre todos os comandos (por exemplo,
/usr/bin/[
assim como[
), você pode passar-a
paratype
. Eu recomendo que você ainda classifique e remova as duplicatas dos resultados primeiro, ou você terá muitas repetições na saída.Ou, também para proteger contra globbing:
Quais comandos você tem varia entre os ambientes de shell
Observe que os comandos de um caractere que você possui, como os comandos que você possui em geral, são uma propriedade do seu ambiente de shell. Diferentes usuários, ou diferentes shells em execução pelo mesmo usuário, podem ter diferentes comandos disponíveis. O
l
comando no Ubuntu, por exemplo, é definido em/etc/skel/.bashrc
, que é copiado para~/.bashrc
quando as contas de usuário são criadas da maneira usual.Assim, você pode alterar ou remover a definição de
l
em seu arquivo~/.bashrc
. Ou simplesmente executeunalias l
para afetar apenas seu shell atual.