Se eu digitar
::
em um shell bash, recebo:
-bash: ::: command not found
Mas, apenas um :
resulta em nenhuma saída. Por que é isso?
command-line
bash
NerdOfLinux
fonte
fonte
Respostas:
O
:
shell embutido vs inexistente::
O
:
comando interno do shell existe (observe a diferença entre comandos externos e internos ) que não faz nada; apenas retorna sucesso, assim como otrue
comando. O:
built-in é padrão e definido pelo padrão POSIX , onde também é conhecido como "utilitário nulo". É freqüentemente usado para testar ou executar loops infinitos, como emwhile : ; do ...;done
No entanto,
::
- dois caracteres de dois pontos juntos - são interpretados como uma "palavra" no shell e supõe ser um comando digitado pelo usuário. O shell passará pelo processo de verificação de built-ins e, em seguida, qualquer diretório naPATH
variável para a existência desse comando. Mas não existe um::
comando interno nem externo::
. Portanto, isso produz um erro.Bem, qual é o formato típico para um erro?
Portanto, o que você vê não são três pontos, mas o que você digitou colou no formato de erro padrão.
Observe também que isso
:
pode receber argumentos de linha de comando, ou seja, é legal fazer:Nesse caso, o shell considerará isso como duas "palavras", uma das quais é um comando e a outra um parâmetro posicional. Isso também não produzirá nenhum erro! (Veja também a nota histórica (mais adiante nesta resposta) sobre o uso de
:
com parâmetros posicionais.)Em conchas que não sejam bash
Observe que a formatação também pode variar entre diferentes shells. Para
bash
,,ksh
emksh
o comportamento é consistente. Por exemplo, o/bin/sh
shell padrão do Ubuntu (que é realmente/bin/dash
):onde 1 é o número do comando (equivalente ao número da linha em um script).
csh
por outro lado, não produz nenhuma mensagem de erro:De fato, se você executar
strace -o csh.trace csh -c ::
, a saída de rastreamento nocsh.trace
arquivo revela quecsh
sai com o status de saída 0 (sem erros). Mastcsh
gera o erro (sem exibir seu nome):Mensagens de erro
Em geral, o primeiro item na mensagem de erro deve ser o processo ou função em execução (seu shell tenta executar
::
, portanto, a mensagem de erro vem do shell). Por exemplo, aqui o processo de execução éstat
:De fato, o POSIX define a função perror () , que, de acordo com a documentação, utiliza um argumento de seqüência de caracteres, emite uma mensagem de erro após dois pontos e, em seguida, nova linha. Citar:
E o argumento da cadeia de caracteres para
perror()
tecnicamente pode ser qualquer coisa, mas é claro, para maior clareza, normalmente é o nome da função ouargv[0]
.Por outro lado, o GNU possui seu próprio conjunto de funções e variáveis para tratamento de erros , com as quais um programador pode usar
fprintf()
parastderr
transmitir. Como mostra um dos exemplos na página vinculada, algo como isto pode ser feito:Nota histórica
No antigo Unix e Thompson, o shell
:
era usado com agoto
instrução (que, de acordo com o usuário chamado Perderabo neste segmento, não era um shell interno ). Citação do manual:Então você pode fazer algo assim para criar um script de loop infinito:
fonte
command.com
e o Windows 'cmd.exe
têm uma situação semelhante, mas oposta::
é explicitamente um rótulo de goto (não um comando) e é frequentemente redirecionado como um caractere de comentário (por exemplo:: This is a comment
).Os últimos dois pontos são apenas parte da mensagem padrão "não encontrado":
A razão pela qual um único dois pontos não produz nada é que
:
é um comando válido - embora não faça nada (exceto retornarTRUE
). NaSHELL BUILTIN COMMANDS
seção deman bash
:Você às vezes verá isso em construções como
Veja, por exemplo, a que finalidade serve o cólon incorporado?
fonte
Tente qualquer outro comando inexistente e você verá que isso
:
serve a seu propósito normal em inglês:fonte
Os dois pontos adicionados fazem parte da própria mensagem de erro. Se alguém digitar
cd ow
isso resultabash: cd: ow: No such file or directory
, o que mostra que o erro está colocando dois pontos extras: No such file or directory
fonte
o terceiro é um espaçador da formatação
no bash a
:
é uma instrução de linha vaziafonte
você recebe três pontos, porque o formato do erro contém dois pontos:
fonte