Memaksa "buruk" (bukan 0) mengembalikan kode perintah terminal?

8

Saya memiliki kerangka kerja yang ditulis dalam python, dan untuk tujuan pengujian saya pada dasarnya ingin melakukan subproses (alias panggilan shell) ... yang seharusnya kembali dengan RC! = 0. Saya mencoba memanggil beberapa executable yang tidak ada; atau untuk menjalankan "keluar 1"; tetapi untuk beberapa alasan diterjemahkan ke FileNotFoundError.

Jadi, apa lagi yang bisa saya lakukan untuk memicu kode kembali! = 0 (dengan cara "dapat diandalkan"; artinya perintah tidak boleh tiba-tiba mengembalikan 0 pada titik waktu mendatang).

Saya berpikir untuk "mencari" biner yang disebut exit, tetapi yah:

> /usr/bin/env exit
/usr/bin/env: exit: No such file or directory
GhostCat
sumber
1
exit 1adalah cara masa depan-bukti untuk pergi. FileNotFoundError harus disebabkan oleh sesuatu yang lain.
Jos
Ketika saya melakukan "yang keluar" ... tidak ada yang ditemukan. Jadi saya berasumsi bahwa "keluar" adalah fungsi bash; mungkin tidak tersedia ketika saya melakukan panggilan subproses ?!
GhostCat
Kesalahan teknis: kode pengembalian yang tidak nol tidak dimaksudkan sebagai indikasi situasi yang buruk , seperti yang disiratkan oleh pertanyaan Anda. Bahwa "0" berarti "tidak ada yang salah" hanyalah masalah konvensi. Bahkan Anda memiliki 8 bit informasi untuk disampaikan kembali ke proses pemanggilan.
Jos
@ Jo, saya mengerti itu. Tetapi intinya adalah RC! = 0 mengarah ke pengecualian spesifik dari subprocess.check_call (). Saya ingin menegakkan kondisi itu untuk memastikan itu ditangani dengan benar (untuk memastikan bahwa setiap RC! = 0 situasi dalam tes nyata ditangani sebagaimana mestinya).
GhostCat
2
Bagaimana dengan /bin/false?
steeldriver

Jawaban:

18

Jika Anda mencari perintah sistem yang selalu mengembalikan kode keluar non-nol, maka /bin/falsesepertinya itu akan bekerja untuk Anda. Dari man false:

NAME
       false - do nothing, unsuccessfully

SYNOPSIS
       false [ignored command line arguments]
       false OPTION

DESCRIPTION
       Exit with a status code indicating failure.
Steeldriver
sumber
Tidak. Setidaknya pada Ubuntu 16.04.4 menjalankan bash baris perintah berikut memberikan 1 bukannya 5:/bin/false 5; echo $?
fviktor
@fviktor ia keluar dengan status bukan nol - seperti yang dikatakan sinopsis, argumen baris perintah (seperti 5) diabaikan
steeldriver
Kamu benar. Hanya tidak ada cara untuk mengontrol kode keluar yang bukan nol.
fviktor
7

Anda dapat membuat kode pengembalian baru dengan perintah bash -c "exit RETURNCODE", menggantikan "RETURNCODE" dengan nomor apa pun. Perhatikan bahwa itu akan dipangkas menjadi integer 8bit unsigned (0 ... 255) oleh (RETURNCODE mod 256)

Anda dapat memeriksa kode kembali dari perintah shell terakhir di dalam terminal (!) Dengan mengeksekusi echo $?. "$?" variabel berisi kode pengembalian terbaru dan "echo" mencetaknya ke output standar.

Komandan Byte
sumber
+1. Perhatikan bahwa jika Anda menulis ini dalam skrip shell, Anda bisa melakukannya exit RETURNCODE(tanpa bash -cbagian)
Matt Browne
0

Setelah beberapa pengujian lagi, saya menemukan bahwa masalah saya bukan pada sisi "Linux".

Python memiliki modul shlex; yang harus digunakan untuk "membagi" string perintah. Ketika saya mengubah panggilan subproses saya untuk menggunakan output dari shlex.split()memanggil "bash exit 1" memberi saya apa yang saya butuhkan.

GhostCat
sumber