Notei que há um executável binário /bin/echo
no meu sistema Ubuntu MATE 17.04.
Eu pensei, isso é estranho, porque
$ type echo
echo is a shell builtin
O teste superficial sugere que /bin/echo
faz o mesmo tipo de coisa que o Bash embutido echo
:
$ /bin/echo foo
foo
$ /bin/echo $USER
zanna
Então, por que há outra versão echo
separada do programa Bash e por que ou quando eu gostaria de usá-lo?
command-line
bash
echo
Zanna
fonte
fonte
echo
é fornecida como um shell embutido, enquanto essa pergunta por que é fornecida como um comando externo.Respostas:
Se você abrir um
bash
prompt e digitar umecho
comando, ele utilizará um shell embutido em vez de executar/bin/echo
. As razões pelas quais ainda é importante/bin/echo
existir são:echo
interior. Isso não é realmente necessário.Para expandir o número 1, suponha que você deseje mover todos os arquivos regulares cujos nomes começaram com
abc
qualquer lugarsrc
paradest
. Existem várias maneiras de fazer isso, mas uma delas é:Mas suponha que, em vez de apenas executá-lo, você queira ver todos os comandos que serão executados primeiro. Bem, você pode anexar
echo
ao comando da mesma maneira que em outros contextos:Mas
find
não usa um shell. Isso corre/bin/echo
.Além de
find
com-exec
ou-execdir
, o/bin/echo
executável será chamado por outros programas que se executam programas, mas não através de um shell. Isso acontece com oxargs
comando (que está relacionado afind
), bem como em vários outros contextos, tais como aExec=
linha de um.desktop
arquivo . Outro exemplo é quando você executasudo echo
, o que pode ser útil para testar sesudo
está funcionando.Da mesma forma, algumas conchas têm um
printf
builtin, mas/usr/bin/printf
também existe.Uma razão possível menos comum que você pode usar deliberadamente
/bin/echo
é se estiver contando com as diferenças entre ela e oecho
comando fornecido pelo seu shell.man echo
documentos/bin/echo
;help echo
embash
documentos dobash
builtin.echo
não é muito portátil, porque implementações diferentes - tanto em sistemas operacionais quanto em shells no mesmo sistema operacional - suportam opções diferentes (por exemplo,-e
) e diferem no tratamento de barras invertidas . Obviamente, é melhor evitar confiar nesses detalhes e usá-loprintf
, o que é muito mais portátil .Em
bash
, você pode fazer otype
show embutido/bin/echo
também - assumindo que/bin
está no seu$PATH
como sempre deveria ser - passando a-a
bandeira :fonte
cd
existência de um executável (que, quando executado, altera o diretório e sai, deixando o chamador onde estava antes) e alguns SOs possuem um. Pode ser útil citar 4.1 nos padrões GNU .cd
é simplesmente como um teste de capacidade de acessar um determinado diretório: se/usr/bin/cd some/dir
for bem-sucedido, em uma tentativa você testou: a) quesome/dir
existe, b) que é um diretório ou um link para um ec) existem permissões necessárias para você acessar esse diretório; tudo sem mudar seu próprio estado./bin/echo
, não é\bin\echo
, a menos que você esteja usando o Windows. ;)Eliah fez um ótimo trabalho em responder a isso, mas quero comentar sobre a parte "por que há outra versão do
echo
programa Bash separado"? Essa é a pergunta errada.A pergunta certa é: por que isso é embutido em primeiro lugar , quando poderia ter sido (e é) um comando externo perfeitamente adequado?
Por uma questão de simplicidade, dê uma olhada nos builtins no dash, um mísero 38 (o bash tem 61, para comparação, seguindo a saída de
compgen -b
):Quantos destes precisam ser construídos?
[
,echo
,false
,printf
,pwd
,test
, Etrue
não precisa ser builtins: Eles não fazem nada que só um builtin pode fazer (afectam ou obter estado shell que não está disponível para comandos externos). O Bash's,printf
pelo menos, tira vantagem de ser um builtin:printf -v var
salva a saída na variávelvar
.time
O bash também é especial: sendo uma palavra-chave, você pode cronometrar listas de comandos arbitrárias no bash (o dash não tem umtime
equivalente).pwd
também não precisa ser incorporado - qualquer comando externo herdará o diretório de trabalho atual (e também é um comando externo ).:
é uma exceção - você precisa de um NOP, e:
é isso. O restante executa ações que um comando externo pode executar facilmente.Portanto, um quinto desses componentes não precisa ser construído. Porquê então? A página de
dash
manual * na verdade explica de passagem por que esses recursos estão embutidos (ênfase minha):É praticamente isso: esses built-in estão lá porque são usados com frequência, de forma interativa e em scripts, e sua funcionalidade é simples o suficiente para que o shell possa fazer o trabalho. E assim acontece: algumas conchas (a maioria?) Assumiram o cargo. ** Volte para a
sh
partir do 2,9 BSD e você não encontrará umecho
builtin.Portanto, é perfeitamente possível que um shell mínimo possa pular a implementação de comandos como builtins (acho que nenhum shell atual o faz). O projeto coreutils do GNU não pressupõe que você os execute em um shell específico, e o POSIX requer esses comandos. Portanto, o coreutils os fornece de qualquer maneira e ignora aqueles que não têm nenhum significado fora do shell.
* Isso é quase idêntico ao texto da página de manual correspondente do shell Almquist , no qual o dash, o shell Debian Almquist, é baseado.
**
zsh
leva essa idéia ao extremo: os comandos que você obtém ao carregar vários módulos, comozmv
, são coisas que você não acha que um shell precisa entrar . Nesse ponto, a verdadeira questão é: por que você usaria o bash em vez do zsh, que possui todos esses recursos?fonte
:
como um externo não seria realmente um NOP, você ainda teria umaPATH
pesquisa, uma tentativa de executar o comando etc., quando tudo que você realmente deseja é não fazer nada expressamente.:
como um builtin faz isso.pwd
ser incorporado para funcionar da maneira que funciona, com o comportamento padrão de mostrar o caminho "lógico" (pwd -L
)./bin/pwd
só poderia implementar opwd -P
comportamento de mostrar os diretórios pai reais, não o link simbólico que vocêcd
editou.pwd
estado 's é um pouco comprometida pela presença dePWD
, mas sim, que é também um exemplo de festa utilizando o estado incorporado para melhorar a funcionalidade