Perintah yang keluar dengan status nol (bukan / bin / true)?

11

Saya punya Makefile yang menjalankan alat yang membutuhkan waktu agak lama; itu memungkinkan saya untuk mengganti perintah yang digunakan:

make TOOL=alternative-tool

Saya ingin melewati langkah itu di Makefile, jadi saya mencari perintah yang keluar dengan status 0, dan yang memiliki efek samping yang dapat diabaikan.

Jelas, saya hanya bisa menggunakan true, tapi itu agak membingungkan:

make TOOL=true

Bunyinya seolah-olah saya ingin menjalankan alat, tetapi saya tidak melakukannya.

Apakah ada executable yang diinstal default yang tidak /bin/truekeluar dengan status 0, dan yang memiliki nama yang mudah diingat dan mudah diketik?

Roger Lipscombe
sumber
Makefiles mendukung komentar, gnu.org/software/make/manual/html_node/Makefile-Contents.html . Beri komentar di depan baris dan dokumentasikan kode Anda. Itu mengurangi kebingungan dan menjelaskan mengapa Anda menggunakan pendekatan tertentu.
Freiheit
1
Garis apa? Itu TOOL=trueakan berada di baris perintah saat menjalankan make, mungkin didokumentasikan dalam README di dekatnya. Baris aktual yang memanggil alat ada di dalam file 7000-line (pihak ketiga).
Roger Lipscombe

Jawaban:

42

Meskipun Anda telah meminta sesuatu yang "tidak /bin/true", mengganti truedengan nama lengkap /bin/trueuntuk menunjukkan bahwa itu adalah trueprogram dan bukan arti lain dari "benar" mungkin merupakan solusi terbaik.

Kekhawatiran Anda adalah bahwa truedalam

make TOOL=true

tampaknya menjadi sesuatu selain nama perintah. Tetapi jika Anda menulis

make TOOL=/bin/true

maka itu jelas perintah. Seseorang mungkin salah membaca TOOL=trueberarti bahwa beberapa alat lain di suatu tempat dimaksudkan, tetapi tidak ada TOOL=/bin/truekemungkinan salah membaca seperti itu.


Saya tidak yakin kapan :, yang merupakan shell builtin tetapi bukan perintah eksternal, akan bekerja. Henning Makholm telah melaporkan bahwa tampaknya berhasil . Tetapi saya pikir itu tidak bekerja dalam semua situasi, dan Anda menemukan bahwa itu tidak bekerja untuk Anda .

Adapun alias shell, Anda tidak bisa menggunakannya karena ekspansi alias tidak dilakukan dalam argumen yang Anda berikan ke perintah, juga makefiles tidak menggunakan alias shell yang telah ditentukan sebelumnya. Bahkan jika makemenjalankan perintah Anda di shell baru, shell itu tidak akan memiliki alias (dan tidak akan menggunakannya bahkan jika itu memilikinya, karena itu akan menjadi shell noninteraktif, di mana ekspansi alias tidak diaktifkan secara otomatis).

Eliah Kagan
sumber
1
Menggunakan :tampaknya berfungsi dengan baik untuk saya. makeselalu memunculkan shell untuk menjalankan setiap perintah setelah itu dilakukan pergantian sendiri.
hmakholm tersisa Monica
@HenningMakholm Terima kasih, saya sudah mengedit. Anda mungkin ingin memposting jawaban. Lok Lam Cheng telah mengomentari pertanyaan yang disarankan :, tetapi itu harus menjadi jawaban (terutama jika benar) dan komentar itu tidak menjelaskan mengapa orang harus berharap itu bekerja. Dalam sebuah direktori dengan hello.cdan tidak ada Makefile, di mana make hellomengkompilasi hello.cuntuk hello, saya menemukan make CC=: helloberperilaku sesuai dengan apa yang Anda katakan.
Eliah Kagan
2
Sayangnya, untuk Makefile ini (menggunakan erlang.mk ), menggunakan :tidak berfungsi. Menjadi eksplisit tentang /bin/truemungkin adalah cara terbaik untuk melakukannya.
Roger Lipscombe
7

Sementara saya setuju bahwa menggunakan path lengkap untuk truemenjadi solusi terbaik, saya ingin mencatat apa yang mungkin merupakan cara yang paling umum untuk menghindari eksekusi perintah nyata: menempel echodi depannya. Begitu:

make TOOL=echo
muru
sumber
Saya pikir ini kadang berguna ketika penting diingatkan bahwa seseorang menekan tindakan apa pun yang TOOLseharusnya dilakukan. Tanpa -satau setara, makememancarkan informasi yang berlebihan, karena keduanya makedan echoperintah dijalankan secara maketerpisah memancarkan output. Sebagai contoh, ketika saya menjalankan make CC=echo hellodirektori yang memiliki hello.cdan tanpa makefile, saya mendapatkan echo hello.c -o hellosebagai baris pertama dari output dan hello.c -o hellosebagai yang kedua. Tetapi beberapa build menggunakan (atau pengguna dapat menambahkan) -s, dan kemudian sangat membantu. make -s CC=echo hellomemberi adil hello.c -o hello.
Eliah Kagan
(yang mungkin masih berguna jika perintahnya melibatkan ekspansi shell, sehingga Anda bisa mendapatkan ide yang lebih jelas tentang apa yang sedang dijalankan, jika tertarik)
muru
5

Anda selalu dapat membuat perintah sendiri yang tidak menghasilkan apa-apa selain mengembalikan status keluar nol. Beberapa opsi:

  • tautan simbolik yang dinamai dengan tepat ke /bin/true

  • skrip shell kosong

  • program C yang hampir kosong:

    int main() {
        return 0;
    }
David Foerster
sumber
Nama yang bagus untuk program semacam itu adalah noop atau no-op.
arp
0

Buat tautan simbolis di direktori kerja ke / bin / true beri nama seperti skip. Jadi...

skip -> /bin/true

Maka garis make dapat ...

make TOOL=./skip
DocSalvager
sumber
-2

Berikut cara untuk melakukannya dengan karakter yang sedikit lebih banyak:

function T() { /bin/true; }

Setelah Anda melakukannya sekali Anda bisa menjalankannya kembali hanya dengan menggunakan namanya T.

false; T; echo $?
Lee B
sumber
3
Bisakah Anda jelaskan bagaimana fungsi ini dapat dipanggil dari nilai variabel Make (agar dapat digunakan dalam situasi yang dimaksud)?
David Foerster