Что такое подоболочка (в контексте документации, делают)?

Удостоверьтесь, что у Вас есть много области подкачки. Удостоверьтесь, что Ваша система установлена предпочесть подкачивать неактивные страницы (vm.swappiness=100). Затем должно быть достаточно приостановить процесс. Ядро предпочтет выгружать неактивные страницы.

5
01.11.2011, 21:39
4 ответа

make(1) самостоятельно не знает, как выполнить команды оболочки. Это, возможно, было сделано сделать так, но Unix Путь должен хорошо разделить проблемы: make(1) знает, как создать графы зависимостей, которые определяют то, что должно быть сделано, и sh(1) знает как к командам выполнения.

Мнение, которое автор пытается высказать, существует то, что Вы не должны писать те командные строки, таким образом, что более поздний зависит от прежнего, кроме через файловую систему. Например, это не будет работать:

sometarget: some.x list.y of-dependencies.z
    foo=`run-some-command-here`
    run-some-other-command $$foo

Если бы это было сценарием оболочки с двумя строками, то вывод первой команды был бы передан как аргумент второй команде. Но так как каждая из этих команд выполняется в отдельной подоболочке, $foo значение переменной теряется после того, как первая подоболочка существует, таким образом, нет ничего для передачи первому.

Один путь вокруг этого, как подсказал выше, состоит в том, чтобы использовать файловую систему:

TMPDIR=/tmp
TMPFILE=$(TMPDIR)/example.tmp
sometarget: some.x list.y of-dependencies.z
    run-some-command-here > $(TMPFILE)
    run-some-other-command `cat $(TMPFILE)`

Это хранит вывод первой команды в персистентном месте, таким образом, вторая команда может загрузить значение.

Другая вещь, которая смещается make(1) новички иногда - то, который создает, которые обычно разбиваются в несколько строк для удобочитаемости в сценарии оболочки, должны быть записаны на одной строке или обернуты во внешний сценарий оболочки, когда Вы делаете их в a Makefile. Циклы являются хорошим примером; это не работает:

someutilitytarget:
    for f in *.c
    do
        munch-on $f
    done

Необходимо использовать точки с запятой для получения всего на одну строку вместо этого:

someutilitytarget:
    for f in *.c ; do munch-on $f ; done

Для меня, делая, который дает мне командную строку приблизительно дольше, чем 80 символов, я перемещаю ее во внешний сценарий оболочки, таким образом, это читаемо.

9
27.01.2020, 20:33
  • 1
    ++ для хороших примеров –  ktf 31.10.2011, 22:07
  • 2
    "Это, возможно, было сделано сделать так", Это, возможно, также было сделано передать все команды единственной оболочке; у Вас есть объяснение, почему это не было сделано? –  Random832 02.11.2011, 15:56
  • 3
    делает (1) даты с 1977. Пределы длины командной строки были коротки и диски — следовательно, временные файлы сценария — были медленными. –  Warren Young 02.11.2011, 17:19

Сделайте не самостоятельно оболочка, таким образом, она должна выполнить их в оболочке. Книга называет их "подоболочками", потому что делают, самостоятельно (скорее всего), работает в оболочке. Что книга на самом деле пытается объяснить существует то, что каждой команде дают ее собственную оболочку, поэтому если, например, Вы захотите экспортировать переменную на одной строке и использовать ее на следующем (или другой последующий) строка, то она не будет работать ( export концы с оболочкой, это используется в, и следующая строка, выполняются в отдельной оболочке).

3
27.01.2020, 20:33

То, что предназначено, - то, что каждую командную строку в правиле назовут в его собственном процессе оболочки. Причина, это делает, выполняет одну командную строку и затем хочет проверить его прежде, чем назвать следующую командную строку.

Можно было думать о других способах назвать команды, но это - то, как делают, был разработан тогда.

Конечно, сделайте, мог просто разветвить () / должностное лицо () команды, но использование подпроцесса оболочки позволяет пользователю использовать функции оболочки, также.

1
27.01.2020, 20:33
  • 1
    Ни был бы fork/exec решите проблему, посредством чего одна строка не может влиять на среду выполнения следующего. –  dmckee --- ex-moderator kitten 01.11.2011, 02:10

Старый вопрос, но вы также можете запустить команду в оболочке и получить результат

http://electric-cloud.com/blog/2009/03/makefile-performance-shell/

OUTPUT = $(shell pwd)

some-target:
    @echo $(OUTPUT)
1
27.01.2020, 20:33

Теги

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