O que é “sh: 1: pausa: não encontrado”? [fechadas]

-1

Estou aprendendo C como primeira linguagem de programação. Eu digitei o seguinte código-fonte:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a,s,d;

    printf("type the number which you want to add.\n\n");

    scanf("%d %d",&a,&s);
    d=a+s;
    printf("addition is %d\n\n\n",d);

    system("pause");

    return 0;
}

Eu digitei o mesmo código-fonte em Code :: blocks no Windows 7 e no Ubuntu usando Code :: blocks, mas no Ubuntu quando o rodei, no final ele diz

sh: 1: pause: not found

    
por voldemort 19.04.2017 / 20:33

2 respostas

4

A função system(...) em C pega um comando como string (que é uma matriz char em C) e passa para o processador / shell padrão do sistema operacional para executá-lo.

No Windows, isso seria feito por cmd.exe , que tem um comando interno pause que imprime algo como "Pressione qualquer tecla para continuar ..." e aguarda um evento de teclado antes de sair.

No entanto, o Ubuntu felizmente não possui cmd.exe , mas usa sh aqui como seu shell padrão (que é dash internamente), que não possui um comando pause . Você pode usar algo assim:

read -p 'Press Enter to continue...' var

Veja Qual é o equivalente bash do comando pause do DOS? e Qual é o equivalente do Linux para DOS pausa? (Stack Overflow) para mais informações, mas observe que C chama sh aqui e não bash .

Então, no seu código C, a linha pode ser substituída por:

system("read -p 'Press Enter to continue...' var");

Isso tornaria seu programa só executável em sistemas Linux com shells compatíveis com sh , mas não funcionaria mais no Windows dessa forma.

No entanto, observe que o uso de system("pause"); ou alternativas semelhantes (até mesmo independentes de plataforma) é geralmente desencorajado por razões explicadas em sistema (“pausa”); - Por que isso está errado?

    
por Byte Commander 19.04.2017 / 21:06
1

A primeira regra da chamada system() é nunca usá-la, a menos que você tenha um muito bom motivo. Ele inicia um shell como um subprocesso, o qual a) é uma operação um tanto dispendiosa, eb) abre a linguagem de comando shell completa (o que é terrível se você construir a linha de comando a partir da entrada do usuário).

Aqui, o que você está tentando alcançar com isso, está imprimindo um prompt e aguardando uma tecla pressionada. Você já sabe imprimir algo e ler não é muito difícil. Faça um loop sobre getchar() até ver uma nova linha ( \n ) ou leia uma linha completa com fgets() .

No entanto, como você usou scanf() anteriormente, a nova linha que termina a entrada do usuário ainda estará no buffer de entrada. Isso ocorre porque o terminal normalmente dará ao programa apenas linhas completas, mas scanf("%d") não usa as partes após os dígitos. fgets() também combina melhor com o comportamento do terminal aqui.

    
por ilkkachu 19.04.2017 / 21:43