Buộc mã hóa xấu (không phải 0) mã trả về của lệnh đầu cuối?


8

Tôi có một khung được viết bằng python và về mục đích thử nghiệm, về cơ bản tôi muốn thực hiện một quy trình con (còn gọi là shell shell) ... đơn giản là nó sẽ quay trở lại với một RC! = 0. Tôi đã cố gắng gọi một số thực thi không tồn tại; hoặc để chạy "thoát 1"; nhưng những lý do này được dịch sang FileNotFoundError.

Vì vậy, tôi có thể làm gì khác để kích hoạt mã trả về! = 0 (theo cách "đáng tin cậy"; có nghĩa là lệnh không được trả về 0 tại thời điểm trong tương lai).

Tôi nghĩ để "tìm kiếm" cho một nhị phân được gọi là thoát, nhưng tốt:

> /usr/bin/env exit
/usr/bin/env: exit: No such file or directory

1
exit 1là con đường tương lai để đi. FileNotFoundError phải được gây ra bởi một thứ khác.
Jos

Khi tôi làm "lối ra nào" ... không tìm thấy gì. Vì vậy, tôi giả sử rằng "exit" là một hàm bash; có lẽ không có sẵn khi tôi thực hiện một cuộc gọi quy trình con?!
GhostCat chào mừng Monica C.

Nitpicking kỹ thuật: mã trả về khác không không nhằm mục đích là một dấu hiệu của một tình huống xấu , vì câu hỏi của bạn dường như ngụ ý. "0" có nghĩa là "không có gì sai" chỉ là vấn đề quy ước. Trong thực tế, bạn có 8 bit thông tin để chuyển trở lại quá trình gọi.
Jos

@ Tôi hiểu điều đó. Nhưng vấn đề là RC! = 0 dẫn đến một ngoại lệ cụ thể từ sub process.check_call (). Tôi muốn thực thi điều kiện đó để đảm bảo nó được xử lý đúng cách (để đảm bảo rằng mọi tình huống RC! = 0 trong các thử nghiệm thực tế đều được xử lý như mong muốn).
GhostCat chào mừng Monica C.

2
Thế còn /bin/false?
Steeldo

Câu trả lời:


17

Nếu bạn đang tìm kiếm một lệnh hệ thống luôn trả về mã thoát khác không, thì /bin/falsecó vẻ như nó sẽ phù hợp với bạn. Từ man false:

NAME
       false - do nothing, unsuccessfully

SYNOPSIS
       false [ignored command line arguments]
       false OPTION

DESCRIPTION
       Exit with a status code indicating failure.

Không nó không. Ít nhất trên Ubuntu 16.04.4 đang chạy bash, dòng lệnh sau sẽ cho 1 thay vì 5:/bin/false 5; echo $?
fviktor

@fviktor nó thoát với trạng thái khác không - như tóm tắt, các đối số dòng lệnh (chẳng hạn như 5) bị bỏ qua
Steeldo

Bạn đúng. Không có cách nào để kiểm soát mã thoát thực tế khác không.
fviktor

7

Bạn có thể tạo mã trả về mới bằng lệnh bash -c "exit RETURNCODE", thay thế "RETURNCODE" bằng bất kỳ số nào. Lưu ý rằng nó sẽ được cắt thành số nguyên không dấu 8 bit (0 ... 255) bởi (RETURNCODE mod 256)

Bạn có thể kiểm tra mã trả về của lệnh shell cuối cùng bên trong terminal (!) Bằng cách thực thi echo $?. "$?" biến chứa mã trả về gần đây nhất và "echo" in nó ra đầu ra tiêu chuẩn.


+1. Lưu ý rằng nếu bạn đang viết điều này trong một tập lệnh shell, bạn chỉ có thể làm exit RETURNCODE(không có bash -cphần)
Matt Browne

0

Sau một số thử nghiệm nữa, tôi thấy rằng vấn đề của tôi không nằm ở phía "Linux".

Python có một mô-đun shlex; mà nên được sử dụng để "tách" chuỗi lệnh. Khi tôi thay đổi cuộc gọi quy trình con của mình để sử dụng đầu ra của việc shlex.split()gọi "bash exit 1" sẽ cho tôi những gì tôi cần.

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.