Polecenie kończące się z zerowym statusem (not / bin / true)?

11

Mam plik Makefile, który uruchamia narzędzie, które zajmuje trochę czasu; pozwala mi zastąpić użyte polecenie:

make TOOL=alternative-tool

Chciałbym pominąć ten krok w Makefile, więc szukam polecenia, które kończy się ze statusem 0 i ma znikome skutki uboczne.

Oczywiście, mógłbym po prostu użyć true, ale to trochę mylące:

make TOOL=true

Brzmi to tak, jakbym chciał uruchomić narzędzie, ale tak nie jest.

Czy istnieje domyślnie zainstalowany plik wykonywalny, który nie /bin/truewychodzi ze statusem 0 i ma chwytliwą i łatwą do wpisania nazwę?

Roger Lipscombe
źródło
Pliki makefiles obsługują komentarze, gnu.org/software/make/manual/html_node/Makefile-Contents.html . Umieść komentarz przed linią i udokumentuj swój kod. To zmniejsza zamieszanie i wyjaśnia, dlaczego zastosowałeś określone podejście.
Freiheit,
1
Jaka linia? TOOL=trueBędzie w wierszu poleceń podczas wywoływania marki, prawdopodobnie udokumentowane w README w pobliżu. Rzeczywista linia, która wywołuje narzędzie, znajduje się gdzieś w pliku makefile 7000 linii (strony trzeciej).
Roger Lipscombe,

Odpowiedzi:

42

Mimo że poprosiłeś o coś, co nie jest /bin/true, zastąpienie truepełną nazwą, /bin/trueaby pokazać, że jest to trueprogram, a nie jakieś inne znaczenie „prawda”, jest prawdopodobnie najlepszym rozwiązaniem.

Twoim zmartwieniem jest to, że truew

make TOOL=true

wydaje się być czymś innym niż nazwa polecenia. Ale jeśli napiszesz

make TOOL=/bin/true

to jest jednoznacznie rozkaz. Ktoś może źle odczytać, TOOL=trueco oznacza, że ​​jakieś inne narzędzie jest zamierzone, ale takie błędne odczytanie nie TOOL=/bin/truejest prawdopodobne.


Nie jestem pewien, kiedy :zadziała wbudowana powłoka, ale nie polecenie zewnętrzne. Henning Makholm nie poinformował, że wydaje się działać . Ale myślę, że to nie działa we wszystkich sytuacjach i odkryłeś, że to nie zadziałało dla ciebie .

Jeśli chodzi o alias powłoki, nie można go użyć, ponieważ rozszerzenie aliasu nie jest wykonywane w argumentach przekazywanych do polecenia, podobnie jak makefile nie korzystają z wcześniej zdefiniowanych aliasów powłoki. Nawet jeśli makeuruchamia polecenia w nowej powłoce, powłoka ta nie będzie miała aliasu (i nie użyłaby jej nawet, gdyby ją miała, ponieważ byłaby to powłoka nieinteraktywna, w której rozszerzenie aliasu nie jest automatycznie włączane).

Eliah Kagan
źródło
1
Używanie :wydaje mi się w porządku. makezawsze spawnuje powłokę, aby uruchomić każde polecenie po dokonaniu własnych zamian.
hmakholm opuścił Monikę
@HenningMakholm Dzięki, edytowałem. Możesz opublikować odpowiedź. Lok Lam Cheng nie skomentował pytanie do sugerować :, ale powinna być odpowiedź (zwłaszcza jeśli poprawne) i że komentarz nie wyjaśnia, dlaczego należy się spodziewać go do pracy. W katalogu hello.cbez makefile, gdzie make hellokompiluje hello.csię hello, znalazłem make CC=: hellozachowane zgodnie z tym, co mówisz.
Eliah Kagan,
2
Niestety, dla tego konkretnego pliku Makefile (używa erlang.mk ), używanie :nie działa. Wyraźne określenie /bin/truejest prawdopodobnie najlepszym sposobem na zrobienie tego.
Roger Lipscombe,
7

Chociaż zgadzam się, że użycie pełnej ścieżki truebyłoby najlepszym rozwiązaniem, chciałbym zauważyć, jaki jest prawdopodobnie najczęstszy sposób uniknięcia prawdziwego wykonania polecenia: trzymanie się echoprzed nim. Więc:

make TOOL=echo
muru
źródło
Myślę, że czasem jest to przydatne, gdy ważne jest, aby pamiętać, że tłumiono wszystko, TOOLco w przeciwnym razie by zrobiłoby. Bez -slub równoważne, makeemituje zbędne informacje, ponieważ zarówno polecenie , jak makei echopolecenie uruchamiane makeosobno emitują dane wyjściowe. Na przykład, kiedy uruchamiam make CC=echo hellow katalogu, w którym nie hello.cma makefile, otrzymuję echo hello.c -o hellojako pierwszy wiersz danych wyjściowych i hello.c -o hellojako drugi. Ale niektóre kompilacje używają (lub użytkownik może dodać) -s, a wtedy jest to pomocne. make -s CC=echo hellodaje tylko hello.c -o hello.
Eliah Kagan,
(co może być nadal przydatne, jeśli polecenia obejmują rozszerzenia powłoki, aby uzyskać wyraźniejszy obraz tego, co jest uruchamiane, jeśli jest zainteresowany)
muru
5

Zawsze możesz wykonać własne polecenie, które nic nie robi, tylko zwraca zerowy status wyjścia. Niektóre opcje:

  • odpowiednio nazwany symboliczny link do /bin/true

  • pusty skrypt powłoki

  • prawie pusty program C:

    int main() {
        return 0;
    }
    
David Foerster
źródło
Dobra nazwa takiego programu to noop lub no-op.
arp
0

Utwórz dowiązanie symboliczne w katalogu roboczym do / bin / true o nazwie coś takiego skip. A zatem...

skip -> /bin/true

Następnie linią make może być ...

make TOOL=./skip
DocSalvager
źródło
-2

Oto sposób na zrobienie tego z nieco większą liczbą postaci:

function T() { /bin/true; }

Gdy raz to zrobisz, możesz go ponownie uruchomić, używając tylko nazwy T.

false; T; echo $?
Lee B.
źródło
3
Czy możesz wyjaśnić, w jaki sposób można wywołać tę funkcję z wartości Make zmiennej (do wykorzystania w danej sytuacji)?
David Foerster,