ฉันสับสนว่าทำไม“ | true "ใน makefile มีผลเหมือนกับ" || ความจริง”


13

ฉันมี makefile ที่ฉันหยุดบริการก่อนที่จะลบไฟล์ เมื่อไม่สามารถหยุดบริการได้ก็จะเกิดข้อผิดพลาด นี้ชัดเจนไม่พึงประสงค์ดังนั้นฉันคิดว่าฉันต้องการเพิ่มแต่พลาด|| true |ทำให้มัน:

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

ฉันสับสนว่าทำไมสิ่งนี้ถึงใช้ได้และสิ่งที่เกิดขึ้น นี่หมายความว่าtrueเป็นแอปพลิเคชั่นไม่ใช่แค่คำหลัก พวกเขาเหมือนกันหรือไม่ มีเหตุผลที่ดีที่จะใช้| trueหรือไม่

คำตอบ:


16

trueและfalseเป็นcoreutils (โดยทั่วไปแล้วก็คือตัวบิวด์อิน) ที่เพิ่งส่งคืนค่า 0 และไม่ใช่ 0 สำหรับสถานการณ์ที่คุณต้องการพฤติกรรมนั้น จากหน้าคน:

จริง - ไม่ทำอะไรเลยสำเร็จ
เป็นเท็จ - ไม่ทำอะไรเลยไม่สำเร็จ

ดังนั้นคุณกำลังส่งออกstop service fooไปยังท่อtrueซึ่งละเว้นมันและส่งกลับ 0 ในทางเทคนิคมันใช้งานได้ แต่คุณควรใช้|| trueเพื่อให้ชัดเจนว่าเจตนาของคุณคืออะไร; ไม่มีเหตุผลใดที่จะส่งออกไพพ์ไปยังโปรแกรมที่ไม่ได้ใช้งาน


4
ทำให้รู้สึกที่สมบูรณ์แบบ :) ฉันไม่รู้ว่าทำไม แต่การอ่าน"ไม่ทำอะไรเลยไม่สำเร็จ" ทำให้ฉันหัวเราะ.
Kit Sunde

9
อีกเหตุผลที่ควรหลีกเลี่ยง| trueคือถ้าคำสั่งผลิตเอาต์พุตเพียงพอที่จะเติมบัฟเฟอร์ของไพพ์จนเต็มมันจะบล็อกการรอtrueเพื่ออ่าน
cjm

3
@cjm หรือตายเนื่องจาก SIGPIPE
Andy

6
@Kit: โปรดทราบว่าfoo || trueและfoo | trueจะไม่ทำสิ่งเดียวกัน: foo || trueจะแสดงผลลัพธ์จากfooในขณะที่foo | trueจะละทิ้งทุกสิ่งที่fooเขียนไปยังเอาต์พุตมาตรฐาน (และfooมีแนวโน้มที่จะตายด้วยSIGPIPEหรือบล็อกตามที่ระบุไว้แล้ว)
Gilles 'SO- หยุดความชั่วร้าย'

คำตอบนี้สมบูรณ์แบบยกเว้นคำว่า "อาจจะ" ... !
Sam Watkins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.