Em sua forma mais simples, os programas apenas executam comandos de terminal?

18

Digamos, por exemplo, em um programa que me permite selecionar uma pasta e copiá-la para outro local, em um nível muito básico: o aplicativo executando comandos que eu poderia executar no terminal ou está usando alguma API interna do SO para fazer essa mudança?

Por favor, me poupe de quaisquer respostas cruéis; Só estou curioso e totalmente ciente de que isso pode ser percebido como uma pergunta que uma criança de 13 anos faria.

azz0r
fonte
4
Bem-vindo ao perguntar diferente! Algumas perguntas são mais avançadas que outras, e tudo bem; você não precisa se desculpar. Se você tiver uma pergunta sobre o hardware, software da Apple, outros produtos ou serviços da Apple, hardware e software de terceiros para produtos da Apple, e não se trata de tópicos proibidos nas Perguntas frequentes, então você está no lugar certo para fazer sua pergunta ! Então, se a sua pergunta é sobre o tema, é bem-vindo aqui, mesmo se você é um 13-year-old (mas não mais jovens, de acordo com as condições de serviço ).
Daniel
3
Ótima pergunta - há pelo menos três níveis não triviais de respostas para essa pergunta. Espero que isso obtenha uma resposta básica, uma do meio e uma resposta em nível de "John Siracusa disseca o funcionamento interno da estrutura binária de aplicativos do Mac OS X" para que você possa escolher e aprender com todos.
bmike

Respostas:

11

Conceitualmente, ele sempre usa a API do sistema operacional - a questão é apenas de que maneira. Existem essencialmente três opções.

  1. usando a API do sistema operacional de baixo nível (chamadas do sistema) diretamente. No seu exemplo, a tarefa está bastante envolvida: obtenha a lista de itens da pasta, verifique o tipo (pasta, arquivo ...), pois cada um deles cria o item correspondente na pasta de destino, pois os arquivos leem o conteúdo do fonte, escreva no arquivo de destino etc. Como a tarefa é muito complexa, é fácil entender algo errado, de modo que a maioria dos aplicativos evita isso.

  2. use uma biblioteca (API) que simplifica a tarefa. Por exemplo, a estrutura Apple Cocoa fornece à NSFileManagerclasse o copyItemAtPath:toPath:errormétodo que faz todo o trabalho sujo usando a API do sistema operacional de baixo nível; portanto, o aplicativo não precisa usar a API de baixo nível, mas pode confiar em algo que exige menos trabalho e é sempre presente no sistema. Também é provável que a Apple tenha certeza de que funciona bem.

  3. use um processo externo para executar a tarefa. Nesse caso, o processo externo usará um dos dois métodos acima para fazer o trabalho. O aplicativo precisa iniciar esse processo, monitorá-lo e aguardar até que esteja pronto. É provável que esse processo possa ser executado como uma ferramenta de linha de comando; portanto, esse seria um comando que você pode executar no Terminal. Não é garantido, mas muito possível.

A maioria dos aplicativos usa a opção 2. porque é mais simples que 1. e mais segura e eficiente que 3. Para executar um processo externo, é necessário configurá-lo adequadamente e não ter controle sobre o que ele faz. Por exemplo, é muito mais difícil descobrir o que exatamente deu errado em caso de falha e é difícil saber o que está fazendo (por exemplo, mostrar o progresso). É por isso que, na maioria dos casos, os desenvolvedores provavelmente escolherão a opção 2, mas não há garantia. Um exemplo notável são aplicativos que usam scripts de shell para personalização - como instaladores.

Nota do usuário avançado: você pode usar o dtracerecurso do OS X para descobrir o que um aplicativo específico está fazendo. Por exemplo, você pode verificar qualquer processo que esteja gerando para ver as ferramentas que está usando (consulte execsnoop).

Simon Urbanek
fonte
4

Receio que a resposta seja "depende, mas geralmente o segundo". Na verdade, mesmo que um programa GUI esteja executando comandos de terminal, ele será executado chamando uma API.

Um programa que é simplesmente uma lista de comandos do terminal é chamado de script de shell. Esses programas podem ser executados no Mac OS X, mas precisam ser executados em uma janela do Terminal ou iniciar um programa que usa a GUI, se você quiser ver a saída deles. Outros programas podem chamar programas de linha de comando por meio de APIs internas.

Embora a maioria das perguntas de desenvolvimento não seja atual para este site, um exemplo realmente atual envolve a execução do Automator.

Uma opção na lista de comandos internos que um programa criado no Automator pode chamar é a capacidade de chamar um shell script ou uma lista de comandos do Terminal. Mas essa é apenas uma das muitas opções disponíveis em sua API interna.

insira a descrição da imagem aqui

Daniel
fonte
Mas, às vezes, as APIs acabam chamando comandos que você pode acessar no Terminal. Eu li relatórios (nada que eu gostaria de replicar no meu próprio computador, muito obrigado) de que, se /sbin/shutdownestiver danificado ou excluído, o comando Desligar no menu Apple deixa de funcionar.
Daniel
11
Os scripts de shell não precisam ser executados em uma janela de terminal ou em qualquer outro software da janela. Mas se eles produzem uma saída que não é redirecionada para um arquivo, você pode optar por executá-lo em uma janela. Os scripts de shell também podem executar outros programas que possuem janelas.
Ctrl-alt-delor
@richard Absolutamente certo. Editado.
Daniel
2

Uma das grandes idéias por trás do Unix é que (se) você tivesse uma idéia para um programa, primeiro a escreveria como um shell script - essencialmente chamando uma série de comandos.

Então, se o programa provou ser útil, você poderia melhorar sua interface, fazer com que os usuários o testassem e, finalmente, quando estava convencido de que valia a pena, escrever um programa "real".

Isso, é claro, ocorreu antes das interfaces gráficas do usuário assumirem, então um "programa" aqui é um comando da CLI em si.

Você ainda vê essa abordagem em alguns programas modernos, especialmente se eles mostram informações do sistema. Deseja criar um aplicativo simples para listar todos os arquivos em uma pasta? Basta executar ls -al, analisar o resultado e mostrar uma tabela. Divirta-se com os vários parâmetros e você tem seu material para a versão 2.0

Monolo
fonte
1

Uma classe de programas que executam comandos de terminal (mesmo que tudo comece com uma chamada de API) são os ambientes integrados de desenvolvimento de programas, como eclipse ou Xcode. A coleção de ferramentas necessárias para o desenvolvimento do programa é proibitivamente grande para ser contida e mantida para um IDE. Em vez disso, ele cria um makefile (um tipo de script) e o executa com o 'make' do unix (ou equivalente) para percorrer o processo de compilação, vinculação, carregamento e depuração. Por sua vez, o Make executa o compilador, vinculador etc. usando suas interfaces de linha de comando. Isso permite que o IDE seja relativamente independente do conjunto de ferramentas escolhido pelo programador e insensível a atualizações nas ferramentas.

JRobert
fonte
1

Os aplicativos podem executar comandos da CLI para executar uma determinada tarefa, e alguns realmente o fazem; mas devido a problemas de eficiência, os desenvolvedores de aplicativos profissionais evitam executar o comando e, em vez disso, usam as APIs que o comando usa para executar a tarefa necessária.

ismail
fonte
Eu sou um engenheiro de software profissional. Eu chamo comandos dos meus programas. Eu mesmo escreverei alguns ou todos eles, depois escreverei o gui em um idioma diferente. No entanto, eu não usaria os comandos cp (copy) ou mv (move / rename), pois a API para copiar ou renomear é simples. Alguns projetos de software livre usam essa técnica. Alguns esperam ter escrito excelentes ferramentas de linha de comando, mas difíceis de usar (por exemplo, para criar uma imagem iso cd e gravar uma imagem em cd), o especialista em gui escreve um gui que usa essas duas ferramentas, basicamente permitindo que o usuário configure as ferramentas , para configurá-los e monitorar o progresso.
Ctrl-alt-delor
Eu usei API como uma palavra simples que a pergunta usou. Na verdade, eu reescrevi a resposta várias vezes, tornando-a para um público menos familiarizado com o código subjacente e com as convenções de nomenclatura de API vs libs vs Frameworks etc. outro engenheiro de software profissional. Se houver algo que você queira editar na minha postagem que esclareça o assunto, vá em frente e faça isso.
Ismail
Não há ofensa, estou apenas esclarecendo. Um bom programador chamará ou não chamará programas de linha de comando, a decisão será baseada na complexidade e possivelmente (após medir a velocidade) na eficiência. Para o pequeno grupo de profissionais que vende para o mercado, pode ser necessário tornar seu programa complexo; Chamar um programa de linha de comando pode parecer simples. Portanto, é necessário reescrever. Se você faz comissões ou Software Livre, faz a coisa mais simples que funciona.
Ctrl-alt-delor