Comando vs programa?


19

Eu estava procurando a diferença entre addusere useradd, e uma explicação é que useraddé um comando enquanto adduseré um script perl. Eu entendo o que é um script perl, mas o que não entendo é o que commandé exatamente então.

Eu sempre pensei que comandos como ls, ln, cdetc, são todos os programas simples escritos em qualquer língua que simplesmente fazer uma coisa. Qual é a diferença entre esses "programas simples" e um script perl?

Claro que sei que um script (perl) não é compilado, mas interpretado em tempo de execução, mas acho que essa não é a única diferença?


1
não se concentre muito no compilado versus interpretado neste caso. você pode ter um shell interpretado (embora por que você queira um seja questionável). concentre-se no fato de que o código para uma ação de comandos é uma parte estática do código-fonte do shell, enquanto que um script é externo, não se supõe que exista, ou se comporta exatamente o mesmo em dois sistemas ligeiramente diferentes, e pode nem necessariamente têm todas as suas dependências atendidas. scripts são mais flexíveis e, por esse motivo, menos confiáveis ​​em geral, enquanto um comando funcionará em qualquer lugar que o shell funcione.
Frank Thomas

Em palavras simples: comando é qualquer coisa que pode ser executada enquanto programa é um binário que pode ser executado.
Pithikos

Respostas:


32

Em termos simples, um comando é uma instrução (ou um conjunto de instruções) a ser executada por um computador.

Comandos Independentes

Unix utilitários fundamentais, tais como ls, ln, etc, são (em geral) escrita em C e compilado para ser executável autónomo programas que não requerem um intérprete para ser executado; eles geralmente exigem que certos arquivos de biblioteca sejam instalados no sistema, mas isso é uma resposta para outra pergunta.

Scripts

Um script é uma coleção de comandos e, de fato, os próprios scripts são considerados um comando.

Um script Perl é uma sequência de declarações do Perl e requer um perlexecutável (stand-alone e compilado) programa para interpretar as declarações de Perl.

Às vezes, scripts interpretativos grandes e complexos (em linguagens como Perl, Python e Ruby) também são chamados de programas interpretados, enquanto o termo script é reservado para scripts mais curtos e simples.

Um script de shell é uma sequência de outros comandos (qualquer tipo de comando) e requer um shell do Unix, como o Bash, para interpretar o script. Na página do manual do Bash:

Bash é um interpretador de linguagem de comando compatível com sh que executa comandos lidos a partir da entrada padrão ou de um arquivo.

Shell interno

Conchas geralmente têm built-in comandos que não são nem programas nem roteiros Stand Alone-. Em vez disso, eles fazem parte do próprio shell e são executados diretamente pelo shell. cdé um exemplo desse comando interno.

Algumas vezes existem comandos que existem como shell embutidos e como comandos independentes ao mesmo tempo, por exemplo, o echocomando.

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo

echo por si só executa o shell embutido enquanto o comando independente pode ser executado, fornecendo seu caminho completo.

Execute a versão interna do eco:

$ echo --version
--version

Execute o echoprograma independente :

$ /usr/bin/echo --version
echo (GNU coreutils) 8.23
Packaged by Cygwin (8.23-4)
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Nota: As especificações acima se referem a um ambiente Unix, mas os mesmos princípios se aplicam a um ambiente Windows.


O eco ao qual você se refere no Windows é apenas se você instalar o Cygwin. Você não vai encontrar eco * em janelas como que é puramente um comando CMD shell (eco em PowerShell é alias para write-objeto).
Jim B

@ JimB Isso é verdade. Eu editei a última linha para esclarecer o que eu quis dizer. Por coincidência, apenas comecei a aprender o PowerShell esta semana (felizmente, não tenho que trabalhar com .batarquivos há muitos e muitos anos).
Anthony G - Justice para Monica

2

Um comando embutido faz parte do shell. Um programa é executado pelo shell.

Os comandos internos estão contidos no próprio shell. Quando o nome de um comando interno é usado como a primeira palavra de um comando simples (consulte Comandos Simples ), o shell executa o comando diretamente, sem chamar outro programa. Os comandos internos são necessários para implementar funcionalidades impossíveis ou inconvenientes de serem obtidas com utilitários separados.

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Builtin-Commands


Mas useraddnão é um shell embutido. O site acabou de dizer "comando", não "comando interno". Como essa explicação é relevante para esta pergunta?
Barmar

1

Comando significa apenas uma maneira de dizer a um aplicativo ou sistema para fazer alguma coisa.

Um aplicativo normalmente aceita muitos comandos diferentes, da GUI, de stdin, mas outros métodos são possíveis, por exemplo, um soquete UNIX ou pipe nomeado, algum tipo de API da web, uma conexão RPC ou algum outro protocolo personalizado.

Um aplicativo que faz apenas uma coisa e sai, normalmente sem uma GUI, também pode ser chamado de comando, porque você realmente pode apenas "fornecer" a este aplicativo um "comando" significativo. É assim que pequenos programas como lsesse funcionam e por que são chamados de comandos.

Mas você não chamaria o Photoshop de comando, mas certamente emitiria comandos nele através da GUI.

No entanto, o termo pode significar coisas diferentes para pessoas diferentes. No seu exemplo, o comando está sendo usado para descrever um executável que é executado diretamente, em comparação com um arquivo que requer que um interpretador de script funcione. A distinção pode ser importante porque, quando você está executando um script Perl, /usr/bin/perlé o binário que está em execução (por isso, se você deseja matar um script Perl de execução longa, é isso que você precisa procurar ps). No entanto, a maioria dos shells possui comandos "internos" que são comandos para o próprio shell e não fazem com que um executável externo seja executado. Por exemplo, cdé tratado por bashsi só e não chama /sbin/cdou similar.


Perspectiva interessante. No nível de abstração de que você está vendo isso, sou tentado a chamá-lo de 'invocação' ou 'gesto' ou até mesmo de concordar com a terminologia do Android como 'intenção'. Dito isto, não sei se gosto da ideia de fazer um critério compilado versus interpretado. O PowerShell, por exemplo, é interpretado por híbrido (, Net), mas como um shell, ele possui comandos em sua base de código. mas você deve enfatizar que os executáveis ​​externos compilados (código de máquina) são diferentes dos scripts, mas também dos comandos. como eu disse, perspectiva interessante.
Frank Thomas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.