কোনও লক্ষ্য প্রয়োগের জিরোথ আর্গুমেন্ট সেট করার কোনও পসিক্স উপায় আছে কি?


21

ইন bashআপনি ব্যবহার করতে পারেন exec -aএবং zshআপনি অন্যথায় এছাড়াও সেট করতে পারেন ARGV0একটি নির্দিষ্ট zeroth আর্গুমেন্ট সহ একটি প্রোগ্রাম চালানো কিন্তু সেখানে এমনটি একটি POSIX উপায় নেই?

যেমনটি এই একটি মন্তব্যে প্রস্তাবিত হিসাবে আপনি এটি অর্জনের জন্য একটি (অস্থায়ী) প্রতীকী লিঙ্ক তৈরি করতে পারেন তবে নতুন জিরোথ আর্গুমেন্ট মানটিকে সত্যিকার অর্থে কোনও মান নির্ধারণ করতে পারিনি, যেমন একটি নির্দিষ্ট পরম পথ সহ কমান্ড। তাহলে কি আর কোন সমাধান আছে?

উত্তর:


27

না, কোনও পসিক্সের উপায় নেই, এটি করে এমন কোনও সি প্রোগ্রাম তৈরি করে than দ্রুত এবং নোংরা হিসাবে:

$ 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

সম্পূর্ণতার জন্য, এখানে কিছু সি এবং সি ++ প্রোগ্রাম রয়েছে যা লোকেরা ইতিমধ্যে সংকলন করেছে।

আপনি যে মন্তব্যটি দেখিয়েছেন সেগুলি অনুসরণ করে, এটি করার "একটি পসিক্স উপায়" জিজ্ঞাসা করার জন্য আপনার আপাত প্রেরণা হ'ল ডেবিয়ান অ্যালকুইস্ট শেল, মিরবিএসডি কর্ন শেল (সংস্করণ R50e এর আগে যেমন শেলগুলি দিয়ে কেউ কীভাবে একই সমাপ্তি অর্জন করতে পারে তা জানা) ), দেবিয়ান পসিক্স-কমপ্লায়েন্ট অর্ডিনারি শেল এবং অন্যান্য শেলগুলিতে বোর্ন এগেইন এবং জেড শেলগুলির মতো 0 তর্ক যুক্ত করার জন্য এক্সটেনশন নেই। ('93 কর্ন শেল, এবং মিরবিএসডি কর্ন শেল সংস্করণ R50e এর পরে, -aতাদের অন্তর্নির্মিত execকমান্ডগুলির জন্য একটি বিকল্প সমর্থন করে ))

execline

লরেন্ট বেরকোটস execlineএকটি execকমান্ড নিয়ে আসে । এম। চেজেলাসের উদাহরণটির সদৃশ করার জন্য একটির execlineমতো স্ক্রিপ্ট থাকবে

#! / কমান্ড / এক্সিলাইনব -পি
এক্সিকিউটিএ-জিজেডএস পিএস -f

অবশ্যই বেরকোটস execএকটি সাধারণ বাহ্যিক কমান্ড। সুতরাং কেউ এটি ডেবিয়ান অ্যালকুইস্ট শেল স্ক্রিপ্টের মধ্যে থেকে চালাতে পারে। বর্তমান শেল প্রোগ্রামটি execওভারলে করার জন্য একজন শেরটি ব্রেকোটের সাথে ওভারলে করতে ব্যবহার করবে exec, যার ফলে টার্গেট প্রোগ্রামের সাথে 0 টি আর্গুমেন্ট এবং ওভারলেটি সেট করা হবে:

exec / আদেশ / exec -a "$ argv0" printer.sh

জখলাবার

নশ টুলসেটে একটি execকমান্ড অন্তর্ভুক্ত রয়েছে । এম। চেজেলাসের উদাহরণটিকে নকল করতে একটির noshমতো স্ক্রিপ্ট থাকবে have

#! / বিন / জখলাবার
এক্সিকিউটিএ-জিজেডএস পিএস -f

যদিও এটি একটি হল noshবিল্ট-ইন, এই execহল এছাড়াও একজন সাধারণ বাহ্যিক কমান্ড হিসাবে প্রবেশযোগ্য। সুতরাং কেউ এটি ডেবিয়ান অ্যালকুইস্ট শেল স্ক্রিপ্টের মধ্যে থেকে চালাতে পারে। বর্তমান শেল প্রোগ্রামটি execওভারলে করতে কোনও শশারটি নশ টুলসেটের সাথে ওভারলে করতে ব্যবহার করবে exec, যার ফলে টার্গেট প্রোগ্রামের সাথে 0 টি আর্গুমেন্ট এবং ওভারলেটি সেট করা হবে:

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

perp

ওয়েন মার্শালের পার্পে একটি runargv0কমান্ড অন্তর্ভুক্ত রয়েছে । এটি একটি সাধারণ বাহ্যিক আদেশ। সুতরাং কেউ এটি ডেবিয়ান অ্যালকুইস্ট শেল স্ক্রিপ্টের মধ্যে থেকে চালাতে পারে। বর্তমান শেল প্রোগ্রামটি execওভারলে করতে শেল এর একটি পের্প টুলসেটের সাথে ওভারলে করতে ব্যবহৃত হবে runargv0, যার ফলে টার্গেট প্রোগ্রামের সাথে 0 তর্কটি যুক্ত করা হবে এবং ওভারলে হবে:

execararvv0 printer.sh "$ argv0"

চালাও এটা

জেরিট পেপের রানিট একটি chpstকমান্ড অন্তর্ভুক্ত করে । এটি একটি সাধারণ বাহ্যিক আদেশ। সুতরাং কেউ এটি ডেবিয়ান অ্যালকুইস্ট শেল স্ক্রিপ্টের মধ্যে থেকে চালাতে পারে। বর্তমান শেল প্রোগ্রামটি execওভারলে করতে শেল'সটি রানিটের সাথে ওভারলে করতে ব্যবহৃত হবে chpst, যার ফলে টার্গেট প্রোগ্রামের সাথে 0 তর্ক যুক্তি এবং ওভারলেটি সেট করা হবে:

exec chpst -b "$ argv0" printer.sh


1
runitঅনিচ্ছুক থেকে শরণার্থী হিসাবে শরণার্থী হিসাবে systemdপরিচয় করিয়ে আমি খুব আনন্দিত nosh। অনেক ধন্যবাদ!
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.