Что такое «sh: 1: pause: not found»? [закрыто]

Я изучаю C как первый язык программирования. Я набрал следующий исходный код:

#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;
}

Я набрал один и тот же исходный код в блоках Code :: как в Windows 7, так и в Ubuntu с использованием блоков Code ::, но в Ubuntu, когда я запускаю его, в конце отображается

sh: 1: pause: not found

enter image description here

1
задан 19 April 2017 в 21:40

3 ответа

Функция system(...) в C принимает команду в виде строки (которая является массивом символов в C) и передает ее в процессор / оболочку команд операционной системы по умолчанию для ее выполнения.

В Windows это было бы сделано с помощью cmd.exe, которая имеет внутреннюю команду pause, которая печатает что-то вроде «Нажмите любую клавишу, чтобы продолжить ...» и ждет события клавиатуры, прежде чем оно завершится.

Однако, к счастью, в Ubuntu нет cmd.exe, но здесь используется sh в качестве оболочки по умолчанию (внутренняя dash), в которой нет команды pause. Вместо этого вы можете использовать что-то вроде этого:

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

См. Что такое bash-эквивалент команды pOS для DOS? и Что такое Linux, эквивалентный паузе DOS? (Переполнение стека) для получения дополнительной информации, но обратите внимание, что C вызывает здесь sh, а не bash.

Таким образом, в вашем коде C строка может быть заменена на:

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

Это сделает вашу программу работоспособной только в системах Linux с sh -совместимыми оболочками, хотя она больше не будет работать на Окна в этом виде.

Однако, пожалуйста, обратите внимание, что использование system("pause"); или подобных (даже не зависящих от платформы) альтернатив, как правило, не рекомендуется по причинам, хорошо объясненным в системе («пауза»); - Почему это неправильно?

6
ответ дан 3 December 2019 в 06:24

Первое правило эти system() вызов к никогда использование это, если Вы не имеете очень серьезное основание. Это запускает оболочку как подпроцесс, который a) является несколько дорогой операцией и b) открывает полный командный язык оболочки (который ужасен, если Вы создаете командную строку из входа от пользователя).

Здесь, чего Вы пытаетесь достигнуть, с который, печатает подсказку и ожидает нажатия клавиши. Вы уже знаете, как распечатать что-то, и чтение не намного более трудно. Или цикл более чем getchar(), пока Вы не видите новой строки (\n) или читаете сплошную линию с fgets().

Однако, так как Вы использовали scanf() ранее, новая строка, заканчивающая вход пользователя, все еще будет во входном буфере. Это вызвано тем, что терминал будет обычно давать программу, только сплошные линии, но scanf("%d") не использует части после цифр. fgets() также соответствия лучше с поведением терминала здесь.

1
ответ дан 3 December 2019 в 06:24

Как правильно объяснил Byte Commander♦, pause является специфичной для Windows командой и по умолчанию не работает в Linux.
во время компиляции вы можете выбрать между частью Windows или Linux, выполнив что-то вроде этого:

#if defined(_WIN32)
  define PAUSE "pause"
#elif defined(unix) || defined(__unix__) || defined(__unix)
  define PAUSE "read -p 'Press Enter to continue...' var"

и в вашем коде просто выполните :

std::system(PAUSE);

или просто выполните :

void pause()
{
   std::cout<<"Press any key to continue";
   std::getchar();
}

это работает везде!

1
ответ дан 17 November 2020 в 11:25

Другие вопросы по тегам:

Похожие вопросы: