क्या एक लक्ष्य आवेदन के शून्य तर्क को स्थापित करने का एक POSIX तरीका है?


21

में bashआप उपयोग कर सकते हैं exec -aऔर में zshआप वैकल्पिक रूप से भी सेट कर सकते हैं ARGV0एक निश्चित zeroth तर्क के साथ एक कार्यक्रम पर अमल करने लेकिन वहां भी ऐसा करने का एक POSIX तरीका है?

जैसा कि इस एक टिप्पणी में सुझाव दिया गया है कि आप इसे प्राप्त करने के लिए एक (अस्थायी) प्रतीकात्मक लिंक बना सकते हैं, लेकिन इस तरह से मैं नए शून्य तर्क मूल्य को वास्तव में किसी भी मनमाने मूल्य पर सेट नहीं कर सकता, जैसे कि एक निश्चित निरपेक्ष मार्ग के साथ कमांड। तो क्या कोई और उपाय है?

जवाबों:


27

नहीं, ऐसा कोई POSIX तरीका नहीं है, जो C प्रोग्राम को कंपाइल करने के अलावा है। एक त्वरित और गंदे के रूप में:

$ 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 -aद्वारा समर्थित है ksh93, bash, zsh, busybox ash(के बाद से संस्करण 1.27.0), yash, mksh( संस्करण r50e के बाद से ), Schily बॉर्न शैल (अगस्त 2015 से) तो गोले के बीच सबसे अधिक व्यापक है।

संभवतः सबसे पोर्टेबल का सहारा लेना होगा, perlजो सी कंपाइलर की तुलना में उपलब्ध होने की अधिक संभावना है।

$ 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

पूर्णता के लिए, यहां कुछ C और C ++ प्रोग्राम ऐसे हैं जिन्हें लोग पहले ही संकलित कर चुके हैं

आप जिस टिप्पणी की ओर संकेत करते हैं, उसे करने के लिए "ऐसा करने का" POSIX तरीका पूछने के लिए आपकी स्पष्ट प्रेरणा, यह जानना है कि कोई व्यक्ति डेबियन अल्मक्विस्ट शेल, MirBSD फटे शेल (संस्करण R50e से पहले) जैसे शेल के साथ इस अंत को कैसे प्राप्त कर सकता है। ), डेबियन पोसिक्स-कंप्लेंट ऑर्डिनरी शेल, और अन्य गोले जिसमें 0 वें तर्क को सेट करने के लिए एक्सटेंशन नहीं है जैसा कि बॉर्न अगेन और जेड गोले हैं। ('93 Korn खोल, और संस्करण R50e से MirBSD Korn खोल, बाद में -aअपने अंतर्निहित execकमांड के लिए एक विकल्प का समर्थन करते हैं )।

execline

लॉरेंट बर्कोट execlineएक execकमांड के साथ आता है । इसलिए एम। चेज़लस के उदाहरण की नकल करने के लिए एक execlineस्क्रिप्ट होगी जैसे कि

#! / कमांड / एग्जीक्यूट-पी
exec -a zzz ps -f

बरकोट का execएक सामान्य बाहरी कमांड है, बेशक। तो कोई इसे डेबियन अल्मक्विस्ट शेल स्क्रिप्ट के भीतर से चला सकता है। वर्तमान शेल प्रोग्राम execको ओवरले करने के लिए exec, बर्कॉट के साथ शेल के ओवरले का उपयोग किया जाएगा , जो बदले में 0 वें तर्क को सेट करेगा और लक्ष्य प्रोग्राम के साथ ओवरले करेगा:

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

nosh

नोश टूलसेट में एक execकमांड शामिल है । एम। चेज़लस के उदाहरण की नकल करने के लिए एक noshस्क्रिप्ट होगी जैसे कि

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

हालाँकि यह एक noshबिल्ट-इन है, यह एक साधारण बाहरी कमांड के रूप execमें भी सुलभ है। तो कोई इसे डेबियन अल्मक्विस्ट शेल स्क्रिप्ट के भीतर से चला सकता है। वर्तमान शेल प्रोग्राम execको ओवरले करने के लिए , शेल टूल का उपयोग नोश टूलसेट के साथ ओवरले करने के लिए execकरेगा, जो कि टारगेट प्रोग्राम के साथ 0 वें तर्क और ओवरले को सेट करेगा:

निष्पादित / usr / स्थानीय / बिन / निष्पादन -a "$ argv0" printer.sh

perp

वेन मार्शल के पेर में एक runargv0कमांड शामिल है । यह एक साधारण बाहरी कमांड है। तो कोई इसे डेबियन अल्मक्विस्ट शेल स्क्रिप्ट के भीतर से चला सकता है। वर्तमान शेल प्रोग्राम execको ओवरले करने के लिए शेल के टूलप्लेट के साथ शेल के ओवरले का उपयोग किया जाएगा runargv0, जो कि टारगेट प्रोग्राम के साथ 0 वें तर्क और ओवरले को सेट करेगा:

निष्पादित runargv0 printer.sh "$ argv0"

चलाओ

जेरिट पपी के रनिट में एक chpstकमांड शामिल है । यह एक साधारण बाहरी कमांड है। तो कोई इसे डेबियन अल्मक्विस्ट शेल स्क्रिप्ट के भीतर से चला सकता है। वर्तमान शेल प्रोग्राम execको ओवरले करने के लिए , शेल के रनटाइम के साथ ओवरले का उपयोग किया जाएगा chpst, जो बदले में 0 वें तर्क को सेट करेगा और लक्ष्य प्रोग्राम के साथ ओवरले करेगा:

निष्पादित chpst -b "$ argv0" printer.sh


1
runitअनिच्छा से एक शरणार्थी के रूप में बदल गया systemd, मुझे बहुत खुशी हो रही है nosh। बहुत धन्यवाद!
चार्ल्स डफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.