-e ทำอะไรใน bash shebang?


32

ฉันมีสคริปต์ทุบตีต่อไปนี้:

#!/bin/bash -e

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  echo "doesn't exist" 
fi

สคริปต์นี้จะไม่ทำงานหากไม่มี -e อะไร-eทำเพื่อสคริปต์นี้ นอกจากนี้สิ่งที่$?ทำในบริบทนี้?


1
แปลก ไม่-eอยู่ใน man page (ฉันต้องการเห็นที่อยู่คำตอบนี้จริงๆ) $?มีรหัสทางออกสุดท้าย ( egrepกระบวนการที่เกิดขึ้นด้านบน)

2
@pst: เป็นเอกสารที่อยู่ภายใต้-e set
Greg Hewgill

คุณสามารถทำให้สคริปต์ของคุณง่ายขึ้นโดยทำสิ่งนี้:if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
bollovan

2
คุณไม่มีพื้นที่ระหว่างและif [สคริปต์นี้จะไม่ทำงานด้วย -eเพราะถ้าgrepไม่พบอะไรแล้วภายใต้-eสคริปต์ที่จะยุติการมีสิทธิ หากไม่มี-eคุณจะได้รับข้อความย้อนกลับ: สถานะ ( $?) จาก 0 หมายความว่า grep ค้นหาผู้ใช้ โปรดทราบว่านี่ควรเป็น `grep '^ ชื่อผู้ใช้:' โดยวิธีการ (ถ้ามีผู้ใช้อีกคนที่มีชื่อยาวกว่านี้)
Gilles 'หยุดความชั่วร้าย'

3
จะ#/bin/bash -eมีผลเช่นเดียว#/bin/bashกับที่บรรทัดที่ 1 และset -eที่บรรทัดที่ 2 หรือไม่
blong

คำตอบ:


34

ข้อผิดพลาดออกจาก ธงเพิ่มเติม

หากมีข้อผิดพลาดมันจะออกทันที

$ หรือไม่ คือสถานะทางออกของคำสั่งที่ผ่านมา ใน Linux สถานะการออกเป็น 0 หมายความว่าคำสั่งสำเร็จ สถานะอื่นใดจะหมายถึงข้อผิดพลาดเกิดขึ้น

egrep "^ username" / etc / passwd> / dev / null จะค้นหาชื่อผู้ใช้ภายใต้ไฟล์ / etc / passwd หากพบว่ามันเป็นสถานะทางออก $? จะเท่ากับ 0 หากไม่พบสถานะการออกจะเป็นอย่างอื่น (ไม่ใช่ 0) ดังนั้นคุณจะ "ไม่มีเสียงสะท้อน"


นอกจากนี้คุณสามารถทำให้การทำงานสคริปต์ที่ถูกต้องโดยไม่ต้อง -e if egrep "^username" /etc/passwd >/dev/nullโดยการแทนที่สองบรรทัดแรกกับ

1
ทำไมถึงไม่มีsetความจำเป็น : - /

1
@pst: เพราะ-eถูกมอบให้กับ bash เป็นอาร์กิวเมนต์บรรทัดคำสั่ง ตัวเลือกทั้งหมดที่อยู่ภายใต้setได้รับการยอมรับโดยทุบตีในบรรทัดคำสั่ง - หมายเหตุประโยคแรกในส่วนตัวเลือกของหน้าคู่มือ
grawity

14

สวิตช์บรรทัดคำสั่ง bash ทั้งหมดได้รับการบันทึกman bashไว้

      -e ออกทันทีถ้าไปป์ไลน์ (ซึ่งอาจประกอบด้วย
              คำสั่งแบบง่ายเดียว) คำสั่ง subshell อยู่ใน
              วงเล็บหรือหนึ่งในคำสั่งที่ดำเนินการโดยเป็นส่วนหนึ่งของ
              รายการคำสั่งที่อยู่ในเครื่องหมายปีกกา (ดู SHELL GRAMMAR
              ด้านบน) ออกจากสถานะไม่เป็นศูนย์ เปลือกไม่ได้
              ออกถ้าคำสั่งที่ล้มเหลวเป็นส่วนหนึ่งของคำสั่ง
              รายการทันทีหลังจากคำหนึ่งหรือจนกว่าคำหลัก
              ส่วนหนึ่งของการทดสอบตาม if หรือ elif ที่สงวนไว้
              คำซึ่งเป็นส่วนหนึ่งของคำสั่งใด ๆ ที่ดำเนินการใน && หรือ || รายการ
              ยกเว้นคำสั่งที่ตามหลัง && หรือสุดท้าย | ใด ๆ
              คำสั่งในไปป์ไลน์ แต่สุดท้ายหรือถ้าของคำสั่ง
              ค่าที่ส่งคืนจะถูกคว่ำด้วย! กับดักบน ERR
              หากตั้งค่าจะถูกดำเนินการก่อนที่เชลล์จะออก ตัวเลือกนี้
              ใช้กับสภาพแวดล้อมของเชลล์และแต่ละ subshell envi-
              ronment แยกต่างหาก (ดูการดำเนินการตามคำสั่งด้านสิ่งแวดล้อม
              ด้านบน) และอาจทำให้ subshells ออกก่อนที่จะดำเนินการ
              คำสั่งทั้งหมดใน subshell

2
อ่า ฉันค้นหาในชายคนนั้น แต่หลังจากพบ -e ในการทดสอบไฟล์และไม่มี -e ภายใต้อาร์กิวเมนต์หลักที่ฉันยอมแพ้ ตัดตอนมาที่ดี ทำไมถึงไม่มีsetความจำเป็น : - /

1

สคริปต์ของคุณไม่ถูกต้องเพราะ

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  #echo "doesn't exist" # WRONG
  echo "the USER EXISTS"
fi

สถานะการออก 0 - หมายถึง - ทุกอย่างก็โอเคในกรณีของ grep หมายถึง "ตกลงพบสตริง" สถานะการออก! = 0 หมายถึงมีบางอย่างผิดปกติในกรณีของ grep 1 หมายถึง "ไม่พบ", 2 หมายถึง "ไม่สามารถเปิดอินพุต" ...

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