Sıfır durumdan çıkan komut (/ bin / true değil)?


11

Biraz zaman alan bir araç çalıştıran bir Makefile var; kullanılan komutu değiştirmeme izin veriyor:

make TOOL=alternative-tool

Makefile'deki bu adımı atlamak istiyorum, bu yüzden durum 0 ile çıkan ve ihmal edilebilir yan etkileri olan bir komut arıyorum.

Açıkçası, ben sadece kullanabilirsiniz true, ama bu biraz kafa karıştırıcı:

make TOOL=true

Bu , aracı çalıştırmak istiyormuşum gibi görünüyor , ama yapmıyorum.

/bin/true0 durumundan çıkmayan ve akılda kalıcı ve yazması kolay bir adı olan varsayılan olarak yüklenmiş bir yürütülebilir dosya var mı?


Makefiles yorumları destekler, gnu.org/software/make/manual/html_node/Makefile-Contents.html . Satırdan önce bir yorum yazın ve kodunuzu belgeleyin. Bu karışıklığı azaltır ve neden belirli bir yaklaşım kullandığınızı açıklar.
Freiheit

1
Ne hattı? TOOL=trueMuhtemelen yakın bir README belgelenen markasını, çağrılırken komut satırında olacaktır. Aracı çağıran gerçek satır, 7000 satırlık (üçüncü taraf) bir makefile içinde bir yerdedir.
Roger Lipscombe

Yanıtlar:


42

"Değil /bin/true" bir şey isteseniz bile , "true" ifadesinin başka bir anlamından ziyade program olduğunu göstermek trueiçin tam adla değiştirmek muhtemelen en iyi çözümdür./bin/truetrue

Endişen olmasıdır truein

make TOOL=true

komut adından başka bir şey gibi görünüyor. Ama yazarsan

make TOOL=/bin/true

o zaman bu açıkça bir komuttur. Birisi, TOOL=truebaşka bir yerde başka bir aracın amaçlandığı anlamına gelmez, ancak böyle yanlış bir yanlışlık TOOL=/bin/trueolması muhtemel değildir.


:Bir kabuk yerleşik olan, ancak harici bir komut olmayan, ne zaman çalışacağından emin değilim . Henning Makholm etti o işe göründüğünü bildirdi . Ama bence her durumda işe yaramıyor ve sizin için işe yaramadı .

Kabuk takma adına gelince, bir komuta ilettiğiniz bağımsız değişkenlerde takma ad genişletmesi yapılmadığından veya makefiles önceden tanımlanmış kabuk takma adlarından herhangi bir şekilde yararlanamadığından bunu kullanamazsınız. makeKomutlarınızı yeni bir kabukta çalıştırsa bile , bu kabuk takma ada sahip olmaz (ve olsa bile kullanmaz, çünkü takma ad genişletmenin otomatik olarak etkinleştirilmediği etkileşimli olmayan bir kabuk olurdu).


1
Kullanmak :benim için iyi görünüyor. makeher komutu kendi yerine koyduktan sonra çalıştırmak için her zaman bir kabuk oluşturur.
hmakholm Monica

@HenningMakholm Teşekkürler, düzenledim. Bir cevap göndermek isteyebilirsiniz. Lok Lam Cheng , önermek için soruyu yorumlamıştı: , ancak bir cevap olmalı (özellikle doğruysa) ve bu yorum neden çalışmasını beklediğini açıklamıyor. Bir dizindeki hello.cve hiçbir makefile, nerede make helloderler hello.cetmek hellobuldum make CC=: hellone söylediğini göre davrandım.
Eliah Kagan

2
Ne yazık ki, bu belirli Makefile için ( erlang.mk kullanır ), kullanmak :işe yaramaz. Hakkında açık olmak /bin/truemuhtemelen bunu yapmanın en iyi yoludur.
Roger Lipscombe

7

Tam yolu kullanmanın trueen iyi çözüm olacağını kabul etsem de, gerçek komutun yürütülmesini önlemek için muhtemelen en yaygın yolun ne olduğunu belirtmek isterim: echoönüne yapışmak . Yani:

make TOOL=echo

Bence bu, bazen önemli olan herhangi bir eylemin bastırılması gerektiği hatırlatılırsa yararlı olur TOOL. Olmadan -sya da eşdeğeri, makegereksiz bilgiler yayar, çünkü her ikisi de makeve ayrı ayrı echoçalıştırılan komut makeçıktı yayar. Örneğin, makefile make CC=echo helloolan hello.cve olmayan bir dizinde çalıştığımda, echo hello.c -o helloçıktının ilk satırı ve hello.c -o helloikincisi olarak alıyorum . Ancak bazı yapılar kullanır (veya kullanıcı ekleyebilir) -sve sonra yardımcı olur. make -s CC=echo hellosadece verir hello.c -o hello.
Eliah Kagan

(komutlar kabuk genişletmeleri içeriyorsa yine de faydalı olabilir, böylece ilgileniyorsanız neyin çalıştırıldığına dair daha net bir fikir edinebilirsiniz)
muru

5

Her zaman sıfır çıkış durumu döndürmekten başka bir şey yapmayan kendi komutunuzu yapabilirsiniz. Bazı seçenekler:

  • uygun şekilde adlandırılmış sembolik bir bağlantı /bin/true

  • boş bir kabuk betiği

  • neredeyse boş bir C programı:

    int main() {
        return 0;
    }

Böyle bir program için iyi bir isim noop veya no-op olacaktır.
arp

0

Çalışma dizininde / bin / true şeklinde sembolik bir bağlantı oluşturun skip. Böylece...

skip -> /bin/true

Sonra marka olun ...

make TOOL=./skip

-2

İşte biraz daha fazla karakterle yapmanın bir yolu:

function T() { /bin/true; }

Bunu yaptıktan sonra, sadece adını kullanarak yeniden yürütebilirsiniz T.

false; T; echo $?

3
Bu işlevin bir Make değişken değerinden (söz konusu durumda kullanım için) nasıl çağrılabileceğini açıklayabilir misiniz?
David Foerster
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.