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?

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.