Hedef uygulamanın sıfırıncı argümanını ayarlama POSIX yolu var mı?


21

İçinde bashkullanabilir exec -ave içinde zshalternatif ARGV0olarak, belirli bir sıfırıncı argümanla bir program yürütmek için de ayarlayabilirsiniz , ancak bunu yapmanın bir POSIX yolu var mı?

Bu yorumda önerildiği gibi , bunu başarmak için (geçici) sembolik bir bağlantı oluşturabilirsiniz, ancak bu şekilde yeni sıfırıncı argüman değerini herhangi bir keyfi değere, örneğin kesin bir mutlak komutla ayarlayamadım. Peki başka bir çözüm var mı?

Yanıtlar:


27

Hayır, bunu yapan bir C programını derlemekten başka POSIX yolu yoktur. Hızlı ve kirli biri olarak:

$ 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 -atarafından desteklenen ksh93, bash, zsh, busybox ash(çünkü sürüm 1.27.0), yash, mksh( versiyon r50e beri ), Schily Bourne Shell (Ağustos 2015 yılından bu yana) bu yüzden kabukları arasında en yaygındır.

Muhtemelen en portatif, perlbir C derleyicisinden daha uygun olması muhtemeldir.

$ 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

15

Bütünlüğü için, burada insanların zaten derlemiş olduğu bazı C ve C ++ programları .

İşaret ettiğiniz yorumdan yola çıkarak, bunu yapmanın "POSIX yolunu" isteme konusundaki bariz motivasyonunuz, Debian Almquist kabuğu, MirBSD Korn kabuğu (R50e sürümünden önce) gibi kabukları kullanarak bu aynı sonuca nasıl ulaşılabileceğini bilmek demektir. ), Debian POSIX Uyumlu Sıradan kabuk ve 0'ın argümanını Bourne Again ve Z kabukları gibi ayarlamaya yönelik uzantıları olmayan diğer kabuklar. ('93 Korn kabuğu ve R50e sürümünden itibaren MirBSD Korn kabuğu -a, yerleşik execkomutlarına bir seçenek sunar .)

execline

Laurent Bercot enexecline birlikte gelen bir execkomuta . Yani, M. Chazelas'ın örneğini çoğaltmak için, birinin şöyle bir execlinesenaryosu olacaktı:

#! / command / execlineb -P
yürütmek -a zzz ps -f

Bercotlar exec, elbette sıradan bir dış emirdir. Böylece biri onu bir Debian Almquist Shell senaryosundan çalıştırabilir. Mevcut kabuk programını bindirmek için, kabuk exec0'cı execargümanı ayarlayan ve hedef program ile bindiren Bercot ile kaplamak için bir kabuk kullanılır :

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

nosh

Nosh araç seti bir execkomut içerir . M. Chazelas'ın örneğini çoğaltmak için birinin şöyle bir noshsenaryosu olacaktı

# / Bin / nosh
yürütmek -a zzz ps -f

Bir olmasına rağmen noshdahili, bu execise aynı zamanda sıradan bir dış komut olarak erişilebilir. Böylece biri onu bir Debian Almquist Shell senaryosundan çalıştırabilir. Mevcut kabuk programını bindirmek için biri kabuk execaraçlarını, nosh araç takımına bindirmek için kullanır exec, ki bu da 0 argümanını ayarlar ve hedef program ile kaplar:

exec / usr / yerel / bin / exec - Bir "$ argv0" printer.sh

ÇaIan

Wayne Marshall'ın suçu bir runargv0emir içeriyor . Bu sıradan bir dış komuttur. Böylece biri onu bir Debian Almquist Shell senaryosundan çalıştırabilir. Mevcut kabuk programını bindirmek için biri kabuğun execperp araç takımına bindirilmesi için kullanılacaktır runargv0, bu da 0'ın argümanını ayarlayacak ve hedef program ile bindirecektir:

exec runargv0 printer.sh "$ argv0"

runit

Gerrit Pape en runit içeren bir chpstkomut . Bu sıradan bir dış komuttur. Böylece biri onu bir Debian Almquist Shell senaryosundan çalıştırabilir. Mevcut kabuk programını bindirmek için biri kabuğun execrunit ile üst üste binmesi için kullanılır chpst, bu da 0'ın argümanını ayarlar ve hedef program ile kaplar :

exec chpst -b "$ argv0" printer.sh


1
runitİsteksizce gelen bir mülteci olarak systemd, tanıştığıma çok memnun oldum nosh. Çok teşekkürler!
Charles Duffy,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.