Các -e làm gì trong một shebang bash?


32

Tôi có một tập lệnh bash với các phần sau:

#!/bin/bash -e

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

Kịch bản này sẽ không chạy nếu không có -e. Làm gì -echo kịch bản này? Ngoài ra, những gì $?làm trong bối cảnh này?


1
Kì lạ Không có -etrong trang người đàn ông (tôi thực sự muốn xem một câu trả lời địa chỉ này). $?chứa mã thoát cuối cùng (mã của egrepquá trình sinh ra ở trên).

2
@pst: -eđược ghi lại dưới đây set.
Greg Hewgill

Bạn có thể đơn giản hóa tập lệnh của mình bằng cách thực hiện việc này:if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
bollovan

2
Bạn đang thiếu một khoảng trống giữa if[. Kịch bản này sẽ không làm việc với -e , bởi vì nếu grepkhông tìm thấy bất cứ điều gì sau đó dưới -ekịch bản sẽ chấm dứt ngay tại đó. Nếu không -e, bạn đã nhận được thông báo ngược: trạng thái ( $?) bằng 0 có nghĩa là grep đã tìm thấy người dùng. Lưu ý rằng đây phải là `grep '^ tên người dùng:', nhân tiện (nếu có một người dùng khác có tên dài hơn thì sao?).
Gilles 'SO- đừng trở nên xấu xa'

3
Sẽ #/bin/bash -ecó tác dụng tương tự như #/bin/bashtrên dòng số 1 và set -edòng số 2?
blong

Câu trả lời:


34

Lỗi thoát. Thêm cờ

Nếu có lỗi nó sẽ thoát ngay lập tức.

$? là trạng thái thoát của lệnh trong quá khứ. Trong Linux, trạng thái thoát là 0 có nghĩa là lệnh đã thành công. Bất kỳ trạng thái nào khác có nghĩa là một lỗi xảy ra.

egrep "^ tên người dùng" / etc / passwd> / dev / null Sẽ tìm tên người dùng trong tệp / etc / passwd. Nếu nó tìm thấy nó thì trạng thái thoát $? sẽ bằng 0. Nếu không tìm thấy nó, trạng thái thoát sẽ là một cái gì đó khác (không phải 0), do đó bạn sẽ "echo không tồn tại".


Ngoài ra, bạn có thể làm cho tập lệnh hoạt động chính xác mà không cần -e bằng cách thay thế hai dòng đầu tiên bằng if egrep "^username" /etc/passwd >/dev/null.

1
Tại sao không setcần thiết mặc dù? : - /

1
@pst: Bởi vì -eđược đưa ra cho bash dưới dạng đối số dòng lệnh. Tất cả các tùy chọn được liệt kê bên dưới setcũng được bash chấp nhận trong dòng lệnh của nó - lưu ý câu đầu tiên trong phần Tùy chọn của trang hướng dẫn.
grawity

14

Tất cả các chuyển đổi dòng lệnh bash được ghi lại trong man bash.

      -e Thoát ngay lập tức nếu một đường ống (có thể bao gồm một
              một lệnh đơn giản), một lệnh subshell kèm theo
              dấu ngoặc đơn hoặc một trong các lệnh được thực thi như một phần của
              một danh sách lệnh được bao quanh bởi dấu ngoặc nhọn (xem SHELL GRAMMAR
              ở trên) thoát với trạng thái khác không. Vỏ không
              thoát nếu lệnh thất bại là một phần của lệnh
              liệt kê ngay sau một lúc hoặc cho đến khi từ khóa,
              một phần của bài kiểm tra theo if hoặc elif dành riêng
              từ, một phần của bất kỳ lệnh nào được thực thi trong && hoặc || danh sách
              ngoại trừ lệnh theo sau && hoặc ||, bất kỳ
              lệnh trong một đường ống nhưng cuối cùng, hoặc nếu lệnh
              giá trị trả lại đang được đảo ngược với! Một cái bẫy trên ERR,
              nếu được đặt, được thực thi trước khi thoát vỏ. Tùy chọn này
              áp dụng cho môi trường shell và mỗi enshell envi-
              ronment riêng (xem MÔI TRƯỜNG THỰC HIỆN HÀNH LÝ
              ở trên) và có thể khiến các mạng con thoát ra trước khi thực hiện
              tất cả các lệnh trong subshell.

2
À Tôi đã tìm nó ở người đàn ông, nhưng sau khi tìm thấy -e trong các bài kiểm tra tập tin và không -e theo các lý lẽ chính tôi đã từ bỏ. Đoạn trích hay. Tại sao không setcần thiết mặc dù? : - /

1

Kịch bản của bạn không chính xác, bởi vì

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

thoát trạng thái 0 - có nghĩa là - mọi thứ đều ổn, trong trường hợp grep có nghĩa là "OK, đã tìm thấy chuỗi". trạng thái thoát! = 0 có nghĩa là có gì đó không đúng, trong trường hợp grep 1 có nghĩa là "không tìm thấy", 2 có nghĩa là "không thể mở đầu vào" ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.