Команда, которая выходит с нулевым статусом (не / bin / true)?


11

У меня есть Makefile, который запускает инструмент, который занимает немного времени; это позволяет мне заменить используемую команду:

make TOOL=alternative-tool

Я хотел бы пропустить этот шаг в Makefile, поэтому я ищу команду, которая завершается со статусом 0 и имеет незначительные побочные эффекты.

Очевидно, я мог бы просто использовать true, но это немного запутанно:

make TOOL=true

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

Есть ли установленный по умолчанию исполняемый файл, который не имеет /bin/trueвыхода со статусом 0 и имеет броское и легко вводимое имя?


Makefiles поддерживают комментарии, gnu.org/software/make/manual/html_node/Makefile-Contents.html . Поставьте комментарий перед строкой и запишите свой код. Это уменьшает путаницу и объясняет, почему вы использовали определенный подход.
Freiheit

1
Какая линия? Это TOOL=trueбудет в командной строке при вызове make, вероятно, задокументировано в README поблизости. Фактическая строка, которая вызывает инструмент, находится где-то в 7000-строчном (стороннем) make-файле.
Роджер Липскомб

Ответы:


42

Даже если вы попросили указать что- то, что «нет /bin/true», замена trueна полное имя, /bin/trueчтобы показать, что это trueпрограмма, а не какое-то другое значение «правда», вероятно, является лучшим решением.

Вы обеспокоены тем, что trueв

make TOOL=true

Похоже, что-то отличное от имени команды. Но если вы напишите

make TOOL=/bin/true

тогда это однозначно команда. Кто-то может неправильно понять, TOOL=trueчто где-то предназначен какой-то другой инструмент, но такое неправильное чтение TOOL=/bin/trueвряд ли возможно.


Я не уверен, когда :будет работать встроенная оболочка, но не внешняя команда. Henning Makholm уже сообщил , что , как представляется , работа . Но я думаю, что это не работает во всех ситуациях, и вы обнаружили, что это не работает для вас .

Что касается псевдонима оболочки, вы не можете его использовать, поскольку раскрытие псевдонима не выполняется в аргументах, передаваемых команде, и make-файлы не используют ранее определенные псевдонимы оболочки. Даже если makeваши команды выполняются в новой оболочке, эта оболочка не будет иметь псевдонима (и не будет использовать его, даже если он имел его, потому что это будет неинтерактивная оболочка, в которой расширение псевдонима не включается автоматически).


1
Использование, :кажется, работает нормально для меня. makeвсегда порождает оболочку для запуска каждой команды после выполнения собственных замен.
Хмакхольм покинул Монику

@ HenningMakholm Спасибо, я редактировал. Вы можете опубликовать ответ. Лок Лам Чэн был прокомментировал вопрос , чтобы предположить :, но он должен быть ответ (особенно , если правильно) , и что комментарий не объясняет , почему следует ожидать его работы. В каталоге с hello.cи без Makefile, где make helloкомпилирует hello.cк hello, я нашел make CC=: helloсебя в соответствии с тем, что вы говорите.
Элия ​​Каган,

2
К сожалению, для этого конкретного Makefile (он использует erlang.mk ) использование :не работает. Быть откровенным о /bin/true, вероятно, лучший способ сделать это.
Роджер Липскомб

7

Хотя я согласен с тем, что использование полного пути к trueбудет лучшим решением, я хотел бы отметить, что, вероятно, самый распространенный способ избежать реального выполнения команд: поставить echoперед ним метку. Так:

make TOOL=echo

Я думаю, что это иногда полезно, когда важно напомнить, что кто-то подавляет действие, TOOLкоторое в противном случае было бы сделано. Без -sили эквивалент, makeвыдает избыточную информацию, потому что makeи echoкоманда, и команда выполняются по makeотдельности, выдают выходные данные. Например, когда я запускаю make CC=echo helloкаталог, в котором нет hello.cи не существует make-файла, я получаю echo hello.c -o helloкак первую строку вывода, так и hello.c -o helloв качестве второй. Но некоторые сборки используют (или пользователь может добавить) -s, и тогда это полезно. make -s CC=echo helloдает просто hello.c -o hello.
Элия ​​Каган,

(что может быть полезно, если команды включают в себя расширения оболочки, так что вы можете получить более четкое представление о том, что запускается, если интересно)
muru

5

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

  • символическая ссылка с соответствующим названием /bin/true

  • пустой сценарий оболочки

  • почти пустая C-программа:

    int main() {
        return 0;
    }

Хорошее название для такой программы будет noop или no-op.
ARP

0

Создайте символическую ссылку в рабочем каталоге на / bin / true с именем что-то вроде skip. Таким образом , ...

skip -> /bin/true

Тогда линия может быть ...

make TOOL=./skip

-2

Вот способ сделать это с немного большим количеством символов:

function T() { /bin/true; }

После того, как вы сделали это один раз, вы можете повторно выполнить его, просто используя имя T.

false; T; echo $?

3
Не могли бы вы объяснить, как эта функция может быть вызвана из значения переменной Make (для использования в рассматриваемой ситуации)?
Дэвид Фёрстер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.