มีวิธี POSIX ในการตั้งค่าอาร์กิวเมนต์ zeroth ของแอปพลิเคชันเป้าหมายหรือไม่?


21

ในbashคุณสามารถใช้exec -aและzshคุณสามารถผลัดกันยังตั้งARGV0ในการรันโปรแกรมที่มีการโต้แย้งข้อที่ศูนย์บาง แต่มียังเป็นวิธีที่ POSIX ของการทำเพื่อ?

ตามที่แนะนำในความคิดเห็นนี้คุณสามารถสร้างลิงก์สัญลักษณ์ (ชั่วคราว) เพื่อให้ได้สิ่งนี้ แต่วิธีนี้ฉันไม่สามารถตั้งค่าอาร์กิวเมนต์ zeroth ใหม่ให้เป็นค่าใดก็ได้ตามอำเภอใจเช่นคำสั่งที่มีเส้นทางแน่นอน มีวิธีอื่นอีกไหม?

คำตอบ:


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ที่มีแนวโน้มที่จะใช้ได้มากกว่าคอมไพเลอร์ 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

15

เพื่อความสมบูรณ์นี่คือโปรแกรม C และ C ++ สำหรับการทำสิ่งนี้ที่ผู้คนได้รวบรวมไว้ แล้ว

ตามความเห็นที่คุณชี้ไปแรงจูงใจที่ชัดเจนของคุณในการขอ "วิธี POSIX" ในการทำเช่นนี้คือการรู้ว่าเราจะบรรลุจุดสิ้นสุดแบบเดียวกันนี้ได้อย่างไรด้วยเชลล์เช่น Debian Almquist shell, MirBSD Korn shell (ก่อนรุ่น R50e ), เชลล์ธรรมดาที่สอดคล้องกับ Debian POSIX และเชลล์อื่น ๆ ที่ไม่มีส่วนขยายสำหรับการตั้งค่าอาร์กิวเมนต์ 0th เป็น Bourne Again และ Z shell ('93 Korn shell และ MirBSD Korn shell จากรุ่น R50e เป็นต้นไปรองรับ-aตัวเลือกexecคำสั่งในตัว)

execline

Laurent Bercot ของexeclineมาพร้อมกับคำสั่ง ดังนั้นเพื่อทำซ้ำตัวอย่างของ M. Chazelas จะมีสคริปต์เช่นexecexecline

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

แน่นอนว่า Bercot execนั้นเป็นคำสั่งจากภายนอกทั่วไป ดังนั้นจึงสามารถเรียกใช้จากภายในสคริปต์ Debian Almquist Shell ในการซ้อนทับโปรแกรมเชลล์ปัจจุบันหนึ่งจะใช้เชลล์execเพื่อซ้อนทับด้วย Bercot execซึ่งจะตั้งค่าอาร์กิวเมนต์ 0 และโอเวอร์เลย์ด้วยโปรแกรมเป้าหมาย:

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

Nosh

ชุดเครื่องมือ noshมีexecคำสั่ง หากต้องการทำซ้ำตัวอย่างของ M. Chazelas จะมีnoshสคริปต์เช่น

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

แม้ว่ามันจะเป็นnoshในตัวนี้execเป็นยังสามารถเข้าถึงได้เป็นคำสั่งภายนอกสามัญ ดังนั้นจึงสามารถเรียกใช้จากภายในสคริปต์ Debian Almquist Shell ในการซ้อนทับโปรแกรมเชลล์ปัจจุบันเราจะใช้เชลล์execเพื่อซ้อนทับกับชุดเครื่องมือ nosh execซึ่งจะตั้งค่าอาร์กิวเมนต์ที่ 0 และโอเวอร์เลย์ด้วยโปรแกรมเป้าหมาย:

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

perp

perp เวย์นมาร์แชลล์รวมถึงคำสั่ง นี่เป็นคำสั่งภายนอกทั่วไป ดังนั้นจึงสามารถเรียกใช้จากภายในสคริปต์ Debian Almquist Shell หากต้องการวางทับโปรแกรมเชลล์ปัจจุบันหนึ่งจะใช้เชลล์เพื่อซ้อนทับกับชุดเครื่องมือ perp ซึ่งจะตั้งค่าอาร์กิวเมนต์ที่ 0 และโอเวอร์เลย์ด้วยโปรแกรมเป้าหมาย:runargv0execrunargv0

exec runargv0 printer.sh "$ argv0"

runit

runit Gerrit Pape ของรวมถึงคำสั่ง นี่เป็นคำสั่งภายนอกทั่วไป ดังนั้นจึงสามารถเรียกใช้จากภายในสคริปต์ Debian Almquist Shell หากต้องการซ้อนทับโปรแกรมเชลล์ปัจจุบันหนึ่งจะใช้เชลล์เพื่อทับซ้อนกับ runit's ซึ่งจะตั้งค่าอาร์กิวเมนต์ที่ 0 และโอเวอร์เลย์ด้วยโปรแกรมเป้าหมาย:chpstexecchpst

exec chpst -b "$ argv0" printer.sh


1
ในฐานะที่เป็นผู้ลี้ภัยจากrunitการเปิดอย่างไม่เต็มใจที่จะฉันดีใจมากที่จะได้รับการแนะนำให้รู้จักกับsystemd noshขอบคุณมาก!
Charles Duffy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.