Apakah ada perintah Unix standar yang melakukan sesuatu yang mirip dengan contoh saya di bawah ini
$ <cmd here> 56
$ echo Return code was $?
Return code was 56
$
<cmd here>
harus menjadi sesuatu yang bisa di-fork dan meninggalkan 56 sebagai kode keluar saat proses keluar. The exit
dan return
shell builtin tidak cocok untuk apa yang saya cari karena mereka mempengaruhi shell memohon sendiri dengan keluar dari itu. <some cmd>
harus menjadi sesuatu yang dapat saya jalankan dalam konteks non-shell - misalnya, meminta dari skrip Python dengan subprocess
.
Misalnya, /usr/bin/false
selalu keluar segera dengan kode kembali 1, tetapi saya ingin mengontrol apa itu kode kembali. Saya dapat mencapai hasil yang sama dengan menulis skrip pembungkus saya sendiri
$ cat my-wrapper-script.sh # i.e., <some cmd> = ./my-wrapper-script.sh
#!/usr/bin/bash
exit $1
$ ./my-wrapper-script.sh 56
$ echo $?
56
tapi saya berharap kebetulan ada perintah Unix standar yang dapat melakukan ini untuk saya.
sumber
exit
adalah satu-satunya yang bisa saya pikirkan, tetapi cenderung mengakhiri cangkang Anda.bash -c 'exit 56'
ataubash -c "exit $1"
mungkin bekerja untuk Anda.(exit 56)
?true
danfalse
Jawaban:
Sebuah
return
fungsi berbasis akan bekerja, dan menghindari kebutuhan untuk membuka dan menutup shell lain, (sesuai Tim Kennedy komentar 's ):Keluaran:
gunakan
exit
dalam subkulit:Dengan cangkang selain
ksh93
, itu menyiratkan forking proses tambahan sehingga kurang efisien daripada yang di atas.bash
/zsh
/ksh93
hanya trik:(Itu juga menyiratkan proses ekstra (dan IPC dengan pipa)).
zsh
Fungsi lambda:sumber
<some cmd>
merupakan hal yang dapat dieksekusi ()./bin/sh -c ...originalcommand...
Tidak ada perintah UNIX standar untuk hanya mengembalikan nilai tertentu. Utilitas Inti GNU hanya menyediakan
true
danfalse
.Namun, Anda dapat dengan mudah menerapkan ini sendiri sebagai
ret
:Menyusun:
Dan lari:
Cetakan:
Jika Anda membutuhkan ini untuk bekerja di mana-mana (di mana bash tersedia, yaitu) tanpa menginstal alat tambahan, Anda mungkin perlu menggunakan perintah berikut seperti yang disarankan @TimKennedy dalam komentar:
Perhatikan bahwa rentang nilai pengembalian yang valid adalah 0..255 inklusif .
sumber
true
danfalse
berada di Unix (dan bahkan POSIX) juga, tidak hanya di GNU.Jika Anda perlu status keluar diatur oleh perintah yang dijalankan. Tidak ada perintah khusus untuk 1 itu , tetapi Anda dapat menggunakan penerjemah bahasa apa pun yang memiliki kemampuan untuk keluar dengan status keluar sewenang-wenang.
sh
adalah yang paling jelas:Dengan sebagian besar
sh
implementasi, itu terbatas untuk keluar dari kode 0 hingga 255 (sh
akan menerima nilai yang lebih besar tetapi dapat memotongnya atau bahkan menyebabkan sinyal dikirim ke proses yang dijalankansh
seperti dengan ksh93 untuk kode 257 hingga 320).Kode keluar bisa berupa
int
nilai integer ( ) apa pun, tetapi perhatikan bahwa Anda harus mengambilnya denganwaitid()
antarmuka sehingga nilainya tidak terpotong menjadi 8 bit (di Linux, masih terpotong denganwaitid()
baik juga). Oleh karena itu mengapa jarang (dan bukan ide yang baik) untuk menggunakan kode keluar di atas 255 (gunakan 0-123 untuk operasi normal).Kalau tidak:
(itu tidak memotong kode keluar menjadi 8 bit).
Dengan NetBSD
find
, Anda dapat melakukan:1
exit
adalah perintah standar untuk melakukan itu tetapi menjadi builtin khusus shell , tidak ada persyaratan bahwa ada juga perintah dengan nama itu dalam sistem file seperti untuk built-in biasa, dan kebanyakan sistem tidak akan memasukkan satusumber
Simpan ini dalam file bernama
returncode.c
dangcc -o returncode returncode.c
sumber
argv[argc-1]
bukanargv[1]
, dan mengapa Anda tidak mengeluh jikaargc>2
. (2) Saya akan cenderung untuk melakukanargv[1]
tes sebelumargv[0]
ujian, yang memungkinkan pengguna untuk mengatakantrue 56
ataufalse 56
bukanreturncode 56
. Anda tidak memberikan pesan jikaargv[0]
itu sebuah kata danargc>0
- itu bisa membingungkan. (3) Saya terobsesi dengan user-keramahan, jadi saya akan menggunakanstrcasecmp
bukanstrcmp
. (4) Saya cenderung memvalidasi parameter, dan tidak menggunakan nilai balikatoi
tanpa memverifikasinya. Untuk program 2 ¢ seperti ini, saya kira itu tidak masalah.true
maupunfalse
argumen dalam sistem Linuxargv[0]
; program/bin/true
dan/bin/false
merupakan executable yang berbeda, dengan kode keluar hard-coded. Anda telah menulis sebuah program yang dapat diinstal sebagai keduanyatrue
danfalse
(ditautkan), yang cerdik. Tetapi pertanyaannya adalah bagaimana cara mendapatkan status keluar yang ditentukan pengguna. Program Anda menjawab pertanyaan itu, tetapi hanya jika diinstal dengan nama file yang berbeda. Selama Andaargv
tetap melihat, saya percaya bahwa melakukannya dengan cara yang saya sarankan akan mempertahankan tingkat kepintaran, dengan menghindari kebutuhan akan tautan ketiga.Saya tidak yakin apakah satu-satunya masalah Anda dengan
exit
perintah itu keluar dari shell saat ini, tetapi jika demikian, sebuah subkulit mungkin bekerja.Saya menguji ini di Cygwin Bash sekarang dan itu bekerja untuk saya.
Sunting: Maaf saya melewatkan bagian menjalankannya di luar konteks shell. Dalam hal ini, ini tidak akan membantu tanpa membungkusnya dalam
.sh
skrip dan menjalankannya dari lingkungan Anda.sumber
$(exit 42)
mencoba untuk mengeksekusi outputexit 42
sebagai perintah sederhana yang tidak masuk akal (itu juga tidak akan bekerja denganyash
).(exit 42)
(juga berjalanexit
dalam subkulit, tetapi meninggalkan outputnya sendiri) akan lebih masuk akal dan akan lebih portabel (bahkan untuk csh atau shell Bourne).