O shell :
incorporado versus o coexame inexistente ::
O comando% shell_de_automática shell incorporado existe (observe o diferença entre comandos externos e internos ) que não faz nada; apenas retorna sucesso, assim como o comando :
. O true
embutido é padrão e definido pelo padrão POSIX , onde também é conhecido como o "utilitário nulo". É freqüentemente usado para testes ou para executar loops infinitos como em :
bash-4.3$ type :
: is a shell builtin
No entanto, while : ; do ...;done
- dois caracteres de dois pontos juntos - são interpretados como uma "palavra" para o shell, e assume ser um comando que o usuário inseriu. O shell passará pelo processo de verificação de built-ins e, em seguida, por qualquer diretório na variável ::
para a existência desse comando. Mas não existe um comando PATH
nem um comando externo ::
. Portanto, isso produz um erro.
Bem, qual é o formato típico de um erro?
<shell>: <command user typed>: error message
Assim, o que você vê não são 3 pontos, mas o que você digitou no formato de erro padrão.
Note também que ::
pode receber argumentos da 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á erros! (Veja também a nota histórica (mais adiante nesta resposta) sobre o uso de :
com parâmetros posicionais.)
Em shells que não sejam bash
Observe que a formatação também pode variar entre diferentes shells. Para :
, bash
e ksh
, o comportamento é consistente. Por exemplo, o mksh
shell padrão do Ubuntu (que na verdade é /bin/sh
):
$ dash
$ ::
dash: 1: ::: not found
em que 1 é o número do comando (equivalente ao número da linha em um script).
/bin/dash
por contraste não produz nenhuma mensagem de erro:
$ csh
% ::
%
De fato, se você executar csh
, a saída de rastreio no arquivo strace -o csh.trace csh -c ::
revela que csh.trace
sai com o status de saída 0 (sem erros). Mas csh
produz o erro (sem gerar seu nome):
$ tcsh
localhost:~> ::
::: Command not found.
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 tcsh
, portanto a mensagem de erro vem do shell). Por exemplo, aqui o processo de execução é ::
:
$ stat noexist
stat: cannot stat 'noexist': No such file or directory
Na verdade, o POSIX define a função perror () , que, de acordo com a documentação, leva um argumento de seqüência de caracteres, em seguida, gera uma mensagem de erro após dois pontos e, em seguida, nova linha. Citação:
% bl0ck_qu0te% E o argumento string para stat
tecnicamente poderia ser qualquer coisa, mas é claro que, normalmente, é o nome da função ou perror()
.
Por outro lado, o GNU possui seu próprio conjunto de funções e variáveis para tratamento de erros , que um programador pode usar com argv[0]
to fprintf()
stream. Como mostra um dos exemplos da página vinculada, algo assim poderia ser feito:
fprintf (stderr, "%s: Couldn't open file %s; %s\n",
program_invocation_short_name, name, strerror (errno));
Nota histórica
No antigo shell Unix e Thompson, stderr
foi usado com a :
declaração (que, de acordo com Um usuário chamado Perderabo em este tópico não era um shell embutido). Cite o manual:
Você pode fazer algo assim para criar um script de loop infinito:
: repeat
echo "Hello World"
goto repeat