ซึ่งเป็นสำนวนในสคริปต์ทุบตีมากขึ้น: `|| true` หรือ `|| `?


36

ฉันไม่ได้ทำสคริปต์เชลล์มากนักดังนั้นฉันแปลกใจเล็กน้อยเมื่อฉันอ่านเอกสารสำหรับgit submoduleและฉันเห็นไวยากรณ์ที่ใช้ในเอกสารนี้:

การส่งคืนที่ไม่เป็นศูนย์จากคำสั่งใน submodule ใด ๆ ทำให้การประมวลผลสิ้นสุดลง สิ่งนี้สามารถแทนที่ได้โดยการเพิ่ม|| :ไปยังจุดสิ้นสุดของคำสั่ง

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


เป็นที่น่าสังเกตว่า||:(ไม่มีที่ว่าง) ก็ใช้ได้ใน bash เช่นกัน มันจะเป็นสิ่งเดียวกับหรือ|| : || true
Bruno Bronosky

คำตอบ:


38

trueไม่ได้ถูกสร้างขึ้นในเชลล์เป้าหมาย :เสมอคือ (มันเป็นวิธีการป้อนความคิดเห็นก่อนที่จะ#ถูกนำมาใช้)

นั่นและเพราะมันสั้นชนิดอาจเป็นเหตุผลหลักคนชอบมากกว่า:true

หมายเหตุความแตกต่างอื่นใน POSIX shells (สำหรับbash, เฉพาะในโหมด POSIX): ในขณะที่truebuiltin ปกติ (ไม่จำเป็นต้องมี builtin) :เป็นbuiltin พิเศษ ที่มีความหมายบางอย่างซึ่งส่วนใหญ่ไม่น่าจะมีผลกระทบใด ๆ ในกรณีนี้โดยเฉพาะ:

  • หาก:คำสั่งล้มเหลวรวมถึงเนื่องจากการเปลี่ยนเส้นทางที่ล้มเหลวทำให้เชลล์ออก ในทางปฏิบัตินั้นอาจจะไม่สร้างความแตกต่างเว้นแต่ว่าคุณผ่านการเปลี่ยนเส้นทางไป:

    $ sh -c ': > /   ; echo HERE'
    sh: 1: cannot create /: Is a directory
    $ sh -c 'true > /; echo HERE'
    sh: 1: cannot create /: Is a directory
    HERE
  • ในvar=value :, varยังคงกำหนดให้valueหลังจากที่:ผลตอบแทนที่ไม่ได้อยู่ในกรณีของtrue:

    $ var=1; var=2 :   ; echo "$var"
    2
    $ var=1; var=2 true; echo "$var"
    1

นอกจากนี้ทราบว่า|| trueผลงานในเปลือกหอยของrcและcshครอบครัว แต่ไม่|| :( แต่ไม่ได้ที่จะยกเลิกset -eในcsh)

|| ::ไม่ได้เป็นเช่นเดียวกับ มันหมายถึงหรือเรียกใช้เป็น:อย่างอื่น (นั่นคือถ้าไปป์ไลน์ก่อนหน้านี้ล้มเหลว)

set -e
false

จะทำให้เชลล์ออกเนื่องจากset -eและfalseมีสถานะการออกที่ไม่ใช่ศูนย์ (ล้มเหลว) เอset -eฟเฟกต์จะถูกยกเลิกหากคำสั่งที่ส่งคืนสถานะการออกที่ไม่ใช่ศูนย์ถูกใช้เป็นเงื่อนไขเช่น:

if false; then ...
while false; do ...
false && : ...
false || : ...

false && :set -eยกเลิกเท่านั้น false || :ยกเลิกset -eและตั้งค่าสถานะการออก0ให้เป็นสำนวนมากกว่าที่จะบอกว่าเราต้องการที่จะเพิกเฉยต่อรหัสทางออกความล้มเหลวของคำสั่ง ส่วนใหญ่จะโต้แย้งว่า|| trueมีความชัดเจนมากขึ้น (บ่งบอกถึงความตั้งใจชัดเจนมากขึ้น)


5
&& :ยอดเยี่ยมมีเอกสารหรืออ่านเพิ่มเติมเกี่ยวกับเรื่องนี้หรือไม่? Google ขาดความพยายามที่จะค้นหาคำหลักประเภทนี้…
Ian Bytchek

5

โดยทั่วไปในทุบตีเครื่องหมายโคลอน:และtrueเทียบเท่า

คือ || : ถือว่าเป็นสำนวนมากขึ้น?

ฉันคิดว่ามันจะขึ้นอยู่กับบริบท

หากคุณต้องการ a return valueหรือ a conditionเป็นจริงเสมอคุณควรใช้trueคำหลักมันจะทำให้โค้ดของคุณชัดเจนยิ่งขึ้นและให้ผู้ชมทราบว่าคุณต้องการเน้นคุณค่าที่แท้จริงเช่น:

while true; do something

หรือ

<commnad>
RETURN_VALUE= $? || true

และถ้าคุณไม่ต้องการทำอะไรเลยหรือNOPในเปลือกคุณควรใช้เครื่องหมายจุดคู่:

if condition
then
    : # DO NOTHING HERE
else
    do something
fi 

หรือ

while conditon
do
    : # DO NOTHING HERE
done

5

คำตอบส่วนใหญ่ไม่สามารถตอบสนองการใช้งานทั่วไป:ได้

ก่อนอื่นการสนทนานี้ไม่เกี่ยวข้องกับเชลล์ใด ๆ ที่ไม่ใช่อนุพันธ์เชลล์ ( sh) ที่กล่าวมาบอร์นเชลล์ทุกตัวเห็นtrueและ:เหมือนกัน โปรแกรมเมอร์เคยได้รับการสนับสนุนให้ใช้:แทนที่จะเป็นtrueเพราะ:มีอยู่แล้วในขณะที่เคยเป็นกรณีที่trueไม่ได้มีอยู่แล้วในตัว

:มีสองใช้ มันไม่ได้เป็นคำพ้องความหมายสำหรับ#แต่มันมีฟังก์ชั่นที่แตกต่างกัน เมื่อดีบักสคริปต์ของคุณภายใต้ a set -xบรรทัดที่#ถูกใช้จะถูกปล่อยโดยตัวแยกวิเคราะห์และละเว้นทั้งหมดในขณะที่บรรทัดที่:มีการแยกวิเคราะห์และประเมินผล สิ่งนี้มีประโยชน์จริง ๆ ในการดีบักเนื่องจากภายใต้-xบรรทัดเหล่านั้นจะปรากฏขึ้นและค่าของมันหลังจากการประเมินผลจะปรากฏขึ้น มันเหมือนกับการวางprintคำสั่งในรหัสของคุณที่แสดงภายใต้-xโหมดเท่านั้น ระวังด้วยค่าหลังจากที่:พวกเขาเป็นรหัสจริงและผลข้างเคียงสามารถส่งผลกระทบต่อโปรแกรมของคุณ


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