Um comando pode ser executado sem um shell?

1

Estou desenvolvendo um comando de programa executável binário para executar programas e retornar a saída para um campo de texto.

Os parâmetros para o comando envolvem o próprio comando como seria digitado na linha de comando e no diretório. Portanto, a rotina que executa a operação primeiro muda para o diretório e executa o comando.

Por exemplo, se eu quiser executar o comando some.cmd no diretório /home/user , os parâmetros são command = 'some.cmd' e directory = '/home/user' .

O que eu descobri é que some.cmd não funciona, mas se eu alterar o comando para /home/user/some.cmd , o comando funciona. No entanto, o comando ls -l funciona. Também percebo que o comando cd não é reconhecido. Se eu rodar remotamente via ssh , como definir o comando para ssh user@localhost 'cd /home/user && ./some.cmd' , funciona.

Parece que algumas configurações que estão presentes quando o comando é executado em um shell não estão presentes quando ele é executado diretamente, mas fazê-lo via ssh parece criar as configurações para o trabalho.

Existe alguma explicação para isso?

UPDATE: Depois de algumas perguntas, aprendi que a API usada para executar os comandos não estava sendo executada no shell ou não era executada com o ambiente normal disponível no console. Depois de executar os comandos com a opção /bin/sh -c "cd ..." , o problema não é mais. Este é o ambiente fazendo ssh user@localhost 'command ...' me deu.Eu não tenho tanta certeza dos detalhes técnicos, mas, aparentemente, a existência do ambiente disponível quando você executa em seu shell normal nem sempre está disponível para comandos executados diretamente pelo sistema operacional.

    
por vfclists 15.05.2015 / 16:40

3 respostas

3

Quando você tenta executar um arquivo, o sistema precisa saber como encontrar o arquivo. É por isso que funciona se você especificar o caminho completo para ele. O shell também tem uma variável de ambiente PATH que armazena uma lista de diretórios para procurar um executável. É por isso que você não precisa especificar o caminho completo para ls .

    
por 15.05.2015 / 16:45
3

Isso é totalmente um problema com o comando não estar no seu PATH . Ao contrário dos sistemas Windows, o diretório atual não está implícito no caminho de pesquisa dos executáveis. Para executar um comando como ls (ex. ls -l ), ele precisa estar no seu PATH e, de fato, é - type ls mostrará que ele está em /bin ou /usr/bin . No entanto, some.cmd não está no seu PATH e, portanto, não pode ser executado de forma transparente como um comando. Três opções vêm à mente:

  1. Você pode mover some.cmd para um diretório que esteja no seu PATH . Por exemplo, em algumas distribuições /usr/local/bin/ e "$HOME"/bin são adicionadas ao PATH por padrão

  2. Você pode adicionar "$HOME" ao seu PATH

  3. Você pode executar ./some.cmd (um caminho relativo para o diretório atual) em vez de tentar usar some.cmd

  4. simples
por 21.05.2015 / 16:05
1

Oi

Primeira via:

Você pode usar o Libeshell C++ Library para escrever aplicativos de console semelhantes a shell

com esta biblioteca você pode criar aplicativos de linha de comando e estilo shell

Segunda via:

Use este código para executar o comando com C ++:

#include <stdlib.h>

int main(){

system("gnome-terminal -x sh -c 'mkdir /root/Desktop/New-Dir-1 ; mkdir /root/New-Dir-2'");
}
    
por 28.05.2015 / 18:27