$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat
Por que não é echo um utilitário independente como ls
, ps
, cat
etc? Por que é específico do shell? Alguma boa razão?
shell
command-line
shell-builtin
lazer
fonte
fonte
echo
certamente é um Bash embutido. De fato, ele está embutido em todas as principais conchas modernas.Respostas:
Existem duas classes de builtins:
Alguns comandos precisam ser incorporados ao próprio programa shell porque não podem funcionar se forem externos.
cd
é um desses, pois, se fosse externo, só poderia alterar seu próprio diretório; não poderia afetar o diretório de trabalho atual do shell. (Veja também: Por quecd
não é um programa? )A outra classe de comandos é incorporada ao shell apenas para eficiência.
A página do homem tem uma seção sobre builtins que menciona , e como exemplos de comandos nesta classe.
dash
printf
echo
test
Os sistemas Unix sempre incluíram executáveis separados para comandos nessa segunda classe. Esses executáveis separados ainda estão disponíveis em todos os sistemas Unixy que eu usei, embora também estejam embutidos em todos os shell que você provavelmente usará. (O POSIX realmente exige que esses executáveis estejam presentes.)
Acredito que
echo
foi incorporado ao shell no AT&T Unix System V Release 3.1. Baseei isso nas comparações de duas edições diferentes de manuais para os sistemas Unix da série AT & Ts 3B1 . Alguém digitalizou gentilmente as edições de 1986 desses manuais e as colocou online ; estes correspondem à versão original do SVR3. Você pode ver que issoecho
não está na lista na página 523 do Manual do Usuário do UNIX System V, Volume II , onde você esperaria se o comando fosse incorporado ao shell. Na minha cópia em papel local dos manuais SVR3.1 de 1987,echo
está listada nesta seção do manual.Tenho certeza de que essa não é uma inovação de Berkeley CSRG que a AT&T trouxe de volta para casa. O 4.3BSD saiu no mesmo ano que o SVR3, 1986, mas se você olhar a página de manual sh.1 do 4.3BSD , verá que
echo
não está na lista de comandos internos da seção "Comandos Especiais". Se o CSRG fez isso, isso nos deixa querendo uma fonte documentada para provar isso.Nesse ponto, você pode se perguntar se
echo
foi incorporado ao shell antes do SVR3.1 e que esse fato simplesmente não foi documentado até então. O mais novo código-fonte pré-SVR3 AT&T Unix disponível para mim está no pacote PDP-11 System III , em que você encontrará o código-fonte do shell Bourne. Você não vai encontrarecho
na tabela de comando interno, que está em/usr/src/cmd/sh/msg.c
. Com base nos registros de data e hora desse arquivo, isso prova queecho
certamente não estava no shell em 1980.Curiosidades
O mesmo diretório também contém um arquivo chamado
builtin.c
que não contém nada específico para esta pergunta, mas achamos este comentário interessante:fonte
print
comando interno para o ksh que é dito se comportar comoecho
. Este comando também está presente em algo como o AT&T Unix SVR4 2.1 i386 da ISC.print "\012"
produz o mesmo resultado que ecoaria. Pergunto-me por que o ksh tinha impressão e não eco embutido? De qualquer forma realmente interessante.Há uma terceira razão para que alguns comandos sejam incorporados: eles podem ser usados quando a execução de comandos externos é impossível.
Às vezes, um sistema fica tão danificado que o
ls
comando não funciona. Em alguns casos, umecho *
ainda funcionará.Outro exemplo (mais importante!) É
kill
: Se um sistema ficar sem PIDs gratuitos, não será possível executá-/bin/kill
lo (porque ele precisa de um PID :-), mas o interno funcionarákill
.Btw.,
which
É um comando externo (pelo menos não é interno no bash), portanto, não pode listar comandos internos. Por exemplo:fonte
ldconfig
menos que você saiba exatamente o que está fazendo). Além disso, e se você afastar sua partição / bin, ou pior, sua partição / sbin, mas ainda tiver um shell carregado?ps
comando, portanto, você teria que encontrar os PIDs manualmente/proc
.which
seja um alias do bash que é executadoalias | /usr/bin/which --read-alias ...
, o externowhich
pode identificar aliases (mas ainda não embutidos). Não posso decidir se considero isso brilhante ou pervertido.De acordo com o Manual de Referência do Bash , trata-se de conveniência.
O Advanced Bash Scripting Guide tem uma explicação mais detalhada:
Observe também que
echo
existe como um utilitário independente em alguns sistemas. Aqui está o que eu tenho no meu sistema Darwin (MacOSX 10.5.8 - Leopard)echo
também está disponível como interno, mas aparentemente meus scripts usam / bin / echo no meu Mac e usam o Bash embutido na maioria dos meus sistemas Linux e FreeBSD. Mas isso não parece importar, porque os scripts ainda funcionam bem em todos os lugares.fonte
type
.Para complementar a resposta de bhm, digamos Vamos
/bin
acidentalmente foi removido do seuPATH
. Você gostariaecho $PATH
de descobrir isso, certo?fonte
Embora a maioria dos shells inclua um built-in
echo
hoje em dia, o GNU CoreUtils também inclui uma implementação autônoma dele:Parece que você não possui o GNU Coreutils instalado (a maioria dos sistemas operacionais para desktop e servidor baseados em linux o instala por padrão, mas o linux incorporado ou outro UNIX pode usar coleções alternativas de utilitários de shell).
BTW: se você olhar para Busybox , você verá que
ls
,ps
ecat
também são built-in comandos lá (ou pelo menos pode ser, é usado para sistemas embeded e tudo não for necessário pode ser deixado de fora).fonte
/bin/echo
não existe. Eles apenas mostram que o builtin tem precedência sobre qualquerecho
programa no PATH.Aqui está a verdadeira razão pela qual
echo
deve ser um shell embutido:Suponha que você tenha uma senha
$PASSWORD
. Como você escreve em um arquivo./password
? Naturalmente, a maioria dos programadores escreveria:No entanto, se
echo
não fosse um shell embutido, a senha vazaria para todos os usuários através deps
informações.Obviamente, se você quiser ser inteligente, poderá encontrar uma maneira de armazenar uma senha sem
echo
, talvez explorando algum outro recurso do shell:No entanto, ter
echo
como interno é um cinto de segurança importante, pois a maneira mais óbvia de salvar uma senha em um arquivo também deve funcionar.fonte