Saya bingung mengapa "| true "dalam makefile memiliki efek yang sama dengan" | | benar"

13

Saya punya makefile tempat saya menghentikan layanan sebelum menghapus file. Ketika tidak bisa menghentikan layanan, itu akan rusak karena kesalahan. Ini jelas tidak diinginkan jadi saya pikir saya akan menambahkan || truetetapi melewatkan |. Membuatnya:

stop service foo | true
rm /etc/init/foo.conf

Saya bingung mengapa ini bekerja dan apa yang terjadi. Apakah ini berarti trueaplikasi dan bukan hanya kata kunci? Apakah mereka sama? Apakah ada alasan bagus untuk menggunakannya | true?

Kit Sunde
sumber

Jawaban:

16

truedan falseyang coreutils (juga biasanya shell built-in) yang baru saja kembali 0 dan non-0, untuk situasi di mana Anda kebetulan membutuhkan perilaku itu. Dari halaman manual:

benar - tidak melakukan apa pun, berhasil
salah - tidak melakukan apa pun, tidak berhasil

Jadi, Anda menyalurkan output dari stop service foodalam true, yang mengabaikannya dan mengembalikan 0. Secara teknis itu bekerja, tetapi Anda mungkin harus menggunakannya || truesehingga jelas apa maksud Anda; benar-benar tidak ada alasan untuk menyalurkan output ke program yang tidak menggunakannya

Michael Mrozek
sumber
4
Masuk akal. :) Saya tidak tahu mengapa tetapi membaca "tidak melakukan apa-apa, tidak berhasil." membuatku tertawa.
Kit Sunde
9
Alasan lain untuk menghindari | trueadalah bahwa jika perintah menghasilkan output yang cukup untuk mengisi penyangga pipa, itu akan memblokir menunggu untuk truemembacanya.
cjm
3
@ cjm atau mati karena SIGPIPE
Andy
6
@Kit: Catat itu foo || truedan foo | truetidak akan melakukan hal yang sama: foo || trueakan menampilkan output dari foo, sedangkan foo | trueakan membuang semuanya foomenulis ke output standarnya (dan fookemungkinan akan mati dengan SIGPIPEatau memblokir, seperti yang sudah ditunjukkan).
Gilles 'SO- berhenti bersikap jahat'
Jawaban ini sempurna kecuali untuk kata "mungkin" ...!
Sam Watkins