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.