Скорее всего, вы перепутались с переменной PATH
. Возможно, вы переписываете его где-то еще в своем скрипте. Поскольку sort
является внешней командой, противоположной всем остальным в вашей командной строке, например for
, dir
, rd
, которые являются cmd
- внутренними командами, переменная PATH
необходима для поиска команда. Если PATH
не определен, внешние команды выполняются только в текущем рабочем каталоге. Существует также переменная PATHEXT
, необходимая для определения стандартных расширений файлов для исполняемых файлов, таких как .com
, .exe
. Поэтому, когда sort
появляется в командной строке или в пакетном файле, система ищет текущий рабочий каталог и все каталоги, указанные переменной PATH
для файла с базовым именем sort
и одним из расширений, указанных в PATHEXT
. Команда sort
на самом деле называется sort.exe
и обычно находится в C:\Windows\System32
.
По умолчанию порядок выполнения совпадает с порядком выполнения, указанным в списке предварительных условий, если между этими предварительными условиями не существует каких-либо зависимостей.
abc: x y z
Порядок: x y z
.
abc: x y z
y : z
Порядок будет x z y
.
Но в идеале вы должны спроектировать свои файлы Makefile, чтобы он не опирался на порядок, в котором указаны необходимые условия. То есть, если y
должно быть выполнено после z
, должна быть зависимость y : z
.
И имейте в виду, что GNU Make может выполнять некоторые рецепты параллельно, см. Mat's ответ .
В описании POSIX make
содержится обоснование, которое гласит:
Утилиты
make
в большинстве исторических реализаций обрабатывают предпосылки для цели в левом вправо, и для этого необходим формат файла makefile. Он поддерживает стандартную идиому, используемую во многих make-файлах, которые создают программыyacc
; например:foo: y.tab.o lex.o main.o $(CC) $(CFLAGS) -o $@ t.tab.o lex.o main.o
В этом примере, если
blockquote>make
выбрал любой произвольный порядок,lex.o
не может быть сделан с правильнымy.tab.h
. Хотя могут быть лучшие способы выразить эти отношения, он широко используется исторически. Реализации, которые хотят обновить предварительные требования параллельно, должны требовать явного расширенияmake
или формата файла makefile, как описано ранее.( Я считаю, что
t.tab.o
в строке$(CC)
является опечаткой дляy.tab.o
, но это то, что на самом деле говорит логическое обоснование. )Таким образом, наблюдаемое поведение, которое предпосылки обрабатываются слева направо имеет валидацию здесь, хотя она находится только в разделе Обоснование, а не в главном описании. В Обосновании также упоминаются проблемы с параллельными
make
и т. Д.
Из https://stackoverflow.com/a/22638294/636849 вы можете добавить символ трубы:
abc: | x y z
From make manual: Order - предварительные условия могут быть заданы путем размещения символа трубы (|) в списке предварительных условий: любые предпосылки слева от символа трубы являются нормальными; любые предварительные условия справа имеют только порядок:
цели: нормальные требования | только заказы-предпосылки
blockquote>
Вы действительно не должны зависеть от порядка, в котором они выполняются, при прочих равных условиях все три рецепта для этих предпосылок могут выполняться параллельно.
Единственное жесткое правило заключается в том, что все предпосылки должны выполняться до запуска целевого рецепта.
Если между x
, y
и z
нет зависимостей и нет параллельного выполнения, GNU make, похоже, запускает их в указанном вами порядке, но это не гарантируется в Docs.