Hãy xem xét đoạn mã chung bên dưới:
$ cmd1 < <(cmd2) # Or cmd1 <(cmd2)
$ echo $?
Đây, $?
được đặt thành trạng thái thoát của cmd1
. Trạng thái thoát của cmd2
bị mất.
Trong trường hợp của bạn, sqlplus
xảy ra là cmd2. Vì vậy, trạng thái thoát của lệnh đó không được ghi lại trong $?
.
Bạn có thể thử cái này;
$ sqlplus ... | cmd1
$ status=(${PIPESTATUS[@]})
$ for i in ${status[@]}; do
> [ $i -ne 0 ] && echo Exited with $i
> done
$ echo Exited with 0
Lưu ý rằng nếu cmd1
là một cấu trúc phức tạp (như while read
ví dụ:bất kỳ thứ nào bạn chạy trong vòng lặp while đó sẽ được chạy trong một vỏ con và mọi môi trường (biến / pwd) đã thay đổi sẽ bị mất.