Apakah ada cara POSIX mengatur argumen nol dari aplikasi target?

21

Di dalam bashAnda dapat menggunakan exec -adan di dalam zshAnda juga dapat mengatur ARGV0untuk menjalankan program dengan argumen nol tetapi apakah ada juga cara POSIX untuk melakukannya?

Seperti yang disarankan dalam komentar ini, Anda dapat membuat tautan simbolis (sementara) untuk mencapai ini, tetapi dengan cara ini saya tidak dapat menetapkan nilai argumen nol baru untuk benar-benar nilai arbitrer, misalnya perintah dengan jalur absolut tertentu. Jadi, apakah ada solusi lain?

phk
sumber

Jawaban:

27

Tidak, tidak ada cara POSIX, selain mengkompilasi program C yang melakukannya. Sebagai yang cepat dan kotor:

$ echo 'int main(int c,char*v[]){
  execvp(v[1],&v[2]);perror(v[1]);return 127;}'>r.c && make r
$ ./r ps zzz -f
UID        PID  PPID  C STIME TTY          TIME CMD
chazelas  7412  7411  0 10:44 pts/4    00:00:00 /bin/zsh
chazelas 21187  7412  0 22:33 pts/4    00:00:00 zzz -f

exec -adidukung oleh ksh93, bash, zsh, busybox ash(sejak versi 1.27.0), yash, mksh( sejak versi R50E ), yang Schily Bourne Shell (sejak Agustus 2015) sehingga adalah yang paling luas di kalangan kerang.

Mungkin yang paling portabel adalah untuk menggunakan perlyang lebih mungkin tersedia daripada kompiler C.

$ perl -e 'exec {shift} @ARGV' ps zzz -f
UID        PID  PPID  C STIME TTY          TIME CMD
chazelas  7554  7411  0 10:58 pts/12   00:00:00 /bin/zsh
chazelas  7630  7554  0 11:02 pts/12   00:00:00 zzz -f
Stéphane Chazelas
sumber
15

Untuk kelengkapan, berikut adalah beberapa program C dan C ++ untuk melakukan ini yang sudah dikompilasi oleh orang.

Pergi dengan komentar yang Anda tunjukkan, motivasi nyata Anda untuk meminta "cara POSIX" untuk melakukan ini adalah untuk mengetahui bagaimana seseorang dapat mencapai tujuan yang sama dengan cangkang seperti cangkang Debian Almquist, cangkang MirBSD Korn (sebelum versi R50e ), shell Biasa-POSIX-Compliant Biasa, dan shell lain yang tidak memiliki ekstensi untuk mengatur argumen ke-0 seperti yang dimiliki Bourne Again dan Z shell. (Shell '93 Korn, dan shell MirBSD Korn dari versi R50e dan seterusnya, mendukung -aopsi untuk execperintah bawaan mereka .)

execline

Laurent Bercot'sexecline datang dengan sebuah execperintah . Jadi untuk menduplikasi contoh M. Chazelas seseorang akan memiliki execlineskrip seperti

#! / command / execlineb -P
exec -a zzz ps -f

Bercot's execadalah perintah eksternal yang biasa, tentu saja. Jadi orang dapat menjalankannya dari dalam skrip Debian Almquist Shell. Untuk overlay program shell saat ini, seseorang akan menggunakan shell execuntuk overlay dengan Bercot exec, yang pada gilirannya akan menetapkan argumen 0 dan overlay dengan program target:

exec / command / exec -a "$ argv0" printer.sh

tidak

Toolset nosh termasuk execperintah. Untuk menduplikasi contoh M. Chazelas, orang akan memiliki noshskrip seperti

#! / bin / nosh
exec -a zzz ps -f

Walaupun merupakan noshbuilt-in, ini execadalah juga diakses sebagai perintah eksternal biasa. Jadi orang dapat menjalankannya dari dalam skrip Debian Almquist Shell. Untuk overlay program shell saat ini, seseorang akan menggunakan shell execuntuk overlay dengan nosh toolset exec, yang pada gilirannya akan menetapkan argumen 0 dan overlay dengan program target:

exec / usr / local / bin / exec -a "$ argv0" printer.sh

pelaku

Pelatih Wayne Marshall termasuk sebuah runargv0perintah . Ini adalah perintah eksternal biasa. Jadi orang dapat menjalankannya dari dalam skrip Debian Almquist Shell. Untuk overlay program shell saat ini, seseorang akan menggunakan shell execuntuk overlay dengan toolset pel runargv0, yang pada gilirannya akan menetapkan argumen 0 dan overlay dengan program target:

exec runargv0 printer.sh "$ argv0"

menjalankannya

Runit Gerrit Pape termasuk sebuah chpstperintah . Ini adalah perintah eksternal biasa. Jadi orang dapat menjalankannya dari dalam skrip Debian Almquist Shell. Untuk overlay program shell saat ini, orang akan menggunakan shell execuntuk overlay dengan runit chpst, yang pada gilirannya akan menetapkan argumen 0 dan overlay dengan program target:

exec chpst -b "$ argv0" printer.sh

JdeBP
sumber
1
Sebagai pengungsi yang dengan runitenggan beralih ke systemd, saya sangat senang diperkenalkan nosh. Terimakasih banyak!
Charles Duffy