Команда, яка виходить з нульовим статусом (не / 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 . Поставте коментар перед рядком і документуйте свій код. Це зменшує розгубленість і пояснює, чому ви використовували певний підхід.
Фрайхейт

1
Яка лінія? Воно TOOL=trueбуде в командному рядку при виклику make, ймовірно, задокументованому в README поблизу. Фактична лінія, яка викликає інструмент, знаходиться десь у 7-рядковому файлі (сторонній файл).
Роджер Ліпскомб

Відповіді:


42

Навіть незважаючи на те, що ви попросили щось, що є "не /bin/true", замінивши trueповним ім'ям, /bin/trueщоб показати, що це trueпрограма, а не якесь інше значення "справжнього", мабуть, найкраще рішення.

Ваша стурбованість полягає в тому, що trueв

make TOOL=true

видається чимось іншим, ніж ім'я команди. Але якщо ти пишеш

make TOOL=/bin/true

то це однозначно команда. Хтось може неправильно прочитати, TOOL=trueщо означає, що якийсь інший інструмент десь призначений, але таких неправильних прочитаннях TOOL=/bin/trueймовірно.


Я не впевнений, коли працюватиме :оболонка, а не зовнішня команда. Henning Makholm вже повідомив , що , як видається , робота . Але я думаю, що це працює не у всіх ситуаціях, і ти виявив, що це не працює для тебе .

Що стосується псевдоніму оболонки, ви не можете використовувати це, оскільки розширення псевдоніму не виконується в аргументах, які ви передаєте команді, а також makefiles не використовують жодних раніше визначених псевдонімів оболонок. Навіть якщо makeзапускає ваші команди в новій оболонці, ця оболонка не буде мати псевдоніму (і не використовувала б її, навіть якби вона мала, бо це була б неінтерактивна оболонка, де розширення псевдоніму не вмикається автоматично).


1
Використання, :здається, працює добре для мене. makeзавжди створює оболонку для запуску кожної команди після її власної заміни.
hmakholm залишився над Монікою

@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і не має makefile, я отримую echo hello.c -o helloяк перший рядок виводу і hello.c -o helloяк другий. Але деякі побудови використовують (або користувач може додати) -s, і тоді це корисно. make -s CC=echo helloдає просто hello.c -o hello.
Елія Каган

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

5

Ви завжди можете скласти свою власну команду, яка не робить нічого, крім повернення нульового статусу виходу. Деякі варіанти:

  • символічне посилання відповідно до імені /bin/true

  • сценарій порожньої оболонки

  • майже порожня програма С:

    int main() {
        return 0;
    }

Хорошим ім'ям для такої програми було б noop або no-op.
арп

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.