Что такое & ldquo; sh: 1: пауза: не найден & rdquo ;? [закрыто]

Чтобы надежно стереть жесткий диск, я рекомендую использовать Secure Erase

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

6 ответов

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

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

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

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

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

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

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

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

Однако обратите внимание, что использование system("pause"); или аналогичные (даже не зависящие от платформы) альтернативы, как правило, обескуражены по причинам, хорошо объясненным в . Каков эквивалент bash команды паузы DOS?

4
ответ дан 22 May 2018 в 23:26

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

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

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

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

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

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

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

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

Однако обратите внимание, что использование system("pause"); или аналогичные (даже не зависящие от платформы) альтернативы, как правило, обескуражены по причинам, хорошо объясненным в . Каков эквивалент bash команды паузы DOS?

4
ответ дан 18 July 2018 в 14:38

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

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

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

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

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

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

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

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

Однако обратите внимание, что использование system("pause"); или аналогичные (даже не зависящие от платформы) альтернативы, как правило, обескуражены по причинам, хорошо объясненным в . Каков эквивалент bash команды паузы DOS?

4
ответ дан 24 July 2018 в 20:26

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

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

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

1
ответ дан 22 May 2018 в 23:26

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

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

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

1
ответ дан 18 July 2018 в 14:38

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

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

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

1
ответ дан 24 July 2018 в 20:26

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

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