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/true
wychodzi ze statusem 0 i ma chwytliwą i łatwą do wpisania nazwę?
command-line
Roger Lipscombe
źródło
źródło
TOOL=true
Bę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).Odpowiedzi:
Mimo że poprosiłeś o coś, co nie jest
/bin/true
, zastąpienietrue
pełną nazwą,/bin/true
aby pokazać, że jest totrue
program, a nie jakieś inne znaczenie „prawda”, jest prawdopodobnie najlepszym rozwiązaniem.Twoim zmartwieniem jest to, że
true
wwydaje się być czymś innym niż nazwa polecenia. Ale jeśli napiszesz
to jest jednoznacznie rozkaz. Ktoś może źle odczytać,
TOOL=true
co oznacza, że jakieś inne narzędzie jest zamierzone, ale takie błędne odczytanie nieTOOL=/bin/true
jest 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
make
uruchamia 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).źródło
:
wydaje mi się w porządku.make
zawsze spawnuje powłokę, aby uruchomić każde polecenie po dokonaniu własnych zamian.:
, ale powinna być odpowiedź (zwłaszcza jeśli poprawne) i że komentarz nie wyjaśnia, dlaczego należy się spodziewać go do pracy. W kataloguhello.c
bez makefile, gdziemake hello
kompilujehello.c
sięhello
, znalazłemmake CC=: hello
zachowane zgodnie z tym, co mówisz.:
nie działa. Wyraźne określenie/bin/true
jest prawdopodobnie najlepszym sposobem na zrobienie tego.Chociaż zgadzam się, że użycie pełnej ścieżki
true
byłoby najlepszym rozwiązaniem, chciałbym zauważyć, jaki jest prawdopodobnie najczęstszy sposób uniknięcia prawdziwego wykonania polecenia: trzymanie sięecho
przed nim. Więc:źródło
TOOL
co w przeciwnym razie by zrobiłoby. Bez-s
lub równoważne,make
emituje zbędne informacje, ponieważ zarówno polecenie , jakmake
iecho
polecenie uruchamianemake
osobno emitują dane wyjściowe. Na przykład, kiedy uruchamiammake CC=echo hello
w katalogu, w którym niehello.c
ma makefile, otrzymujęecho hello.c -o hello
jako pierwszy wiersz danych wyjściowych ihello.c -o hello
jako drugi. Ale niektóre kompilacje używają (lub użytkownik może dodać)-s
, a wtedy jest to pomocne.make -s CC=echo hello
daje tylkohello.c -o hello
.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:
źródło
Utwórz dowiązanie symboliczne w katalogu roboczym do / bin / true o nazwie coś takiego
skip
. A zatem...Następnie linią make może być ...
źródło
Oto sposób na zrobienie tego z nieco większą liczbą postaci:
Gdy raz to zrobisz, możesz go ponownie uruchomić, używając tylko nazwy
T
.źródło