2013-09-27 3 views

ответ

0

От человека странице:

-c строка Если опция -c присутствует, то команды считываются из строки. Если после строки есть аргументы, они назначаются позиционным параметрам, начиная с $ 0.

Только cmd будет проходить через bash (или что-то другое, что по умолчанию). Вам нужно, чтобы sh явно вызывал аргумент -c.

Экспресс не должен здесь меняться.

2

Это зависит от того, что представляет собой «cmd». В базовом случае, когда это простое имя команды (например, ps или ls), тогда нет никакой разницы в командной строке оболочки и очень мало различий при выполнении execvp(). Функции «non-p» exec*() имеют немного отличающуюся семантику; они не используют переменную PATH, поэтому команда должна существовать и быть исполняемой в текущем каталоге, иначе она завершится с ошибкой.

Однако, если cmd является более сложным, то это может иметь большое значение. Например:

$ echo $$ 
17429 
$ sh -c 'echo $$' 
76322 
$ sh -c "echo $$" 
17429 
$ 

Первый сообщает идентификатор процесса исходной оболочки; второй сообщает идентификатор процесса оболочки как sh; третий - дорогой способ сообщить идентификатор процесса исходной оболочки. Обратите внимание, что одиночные кавычки и двойные кавычки также значительны. Здесь котировки не будет присутствовать в C вызова (оболочка удаляет кавычки из разных аргументов), а значение $$ будет то, что ребенка оболочки:

char *argv[] = { "sh", "-c", "echo $$", 0 }; 
execvp(argv[0], argv); 

(я сказал, что котировки не присутствуют в вызове C, они необходимы вокруг строки в коде C, но значение, переданное в sh, не содержит кавычек - поэтому я имел в виду то, что я сказал, хотя это может быть не столь ослепительно очевидным, как все это .)

+0

Другим примером является 'cd' vs' sh -c cd'. Первый изменяет текущий каталог на дом, а второй ничего не делает. – tom

+0

@tom: действительно, с дополнительным усложнением, что для выполнения функций 'exec * Подобные комментарии относятся к другим встроенным функциям оболочки - 'exit',' jobs', ... –

Смежные вопросы