Có cách POSIX nào để thiết lập đối số zeroth của ứng dụng đích không?


21

Trong bashbạn có thể sử dụng exec -azshbạn có thể cách khác cũng thiết lập ARGV0để thực hiện một chương trình với một đối số 0 nào đó nhưng có cũng là một cách POSIX làm như vậy?

Như được đề xuất trong một nhận xét này, bạn có thể tạo một liên kết tượng trưng (tạm thời) để đạt được điều này nhưng bằng cách này tôi không thể đặt giá trị đối số zeroth mới thành bất kỳ giá trị tùy ý nào, ví dụ: lệnh với một đường dẫn tuyệt đối nhất định. Vậy có giải pháp nào khác không?

Câu trả lời:


27

Không, không có cách POSIX nào, ngoài việc biên dịch chương trình C thực hiện nó. Như một cách nhanh chóng và bẩn thỉu:

$ 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được hỗ trợ bởi ksh93, bash, zsh, busybox ash(kể từ phiên bản 1.27.0), yash, mksh( kể từ phiên bản r50e ), các Schily Bourne Shell (kể từ tháng Tám năm 2015) như vậy là phổ biến nhất trong vỏ.

Có lẽ tính di động cao nhất sẽ là dùng đến perlkhả năng có sẵn hơn trình biên dịch 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

Để đầy đủ, đây là một số chương trình C và C ++ để làm điều này mà mọi người đã biên dịch.

Đi theo lời bình luận mà bạn chỉ ra, động lực rõ ràng của bạn khi yêu cầu "một cách POSIX" để làm điều này là để biết làm thế nào người ta có thể đạt được kết thúc tương tự này với các vỏ như vỏ sò Debian Almquist, vỏ KBS MirBSD (trước phiên bản R50e ), shell Thông thường tuân thủ Debian POSIX và các shell khác không có phần mở rộng để đặt đối số thứ 0 như shell Bourne Again và Z shell. (Vỏ '93 Korn và vỏ KBS MirBSD từ phiên bản R50e trở đi, hỗ trợ -atùy chọn cho các execlệnh tích hợp của chúng.)

thực hiện

Laurent Bercotexecline đi kèm với một execlệnh . Vì vậy, để sao chép ví dụ của M. Chazelas, người ta sẽ có một execlinekịch bản như

#! / lệnh / execlineb -P
thực hiện -a zzz ps -f

Bercot execlà một lệnh bên ngoài thông thường, tất nhiên. Vì vậy, người ta có thể chạy nó từ trong tập lệnh Shell Almquist Shell. Để phủ lớp chương trình shell hiện tại, người ta sẽ sử dụng shell của execlớp phủ với Bercot exec, do đó sẽ đặt đối số 0 và lớp phủ với chương trình đích:

exec / lệnh / exec -a "$ argv0" print.sh

quà vặt

Bộ công cụ nosh bao gồm một execlệnh. Để sao chép ví dụ của M. Chazelas, người ta sẽ có một đoạn noshscript như

#! / bin / nosh
thực hiện -a zzz ps -f

Mặc dù nó là một noshbuilt-in, đây execcũng dễ tiếp cận như một lệnh bên ngoài bình thường. Vì vậy, người ta có thể chạy nó từ trong tập lệnh Shell Almquist Shell. Để phủ lớp chương trình shell hiện tại, người ta sẽ sử dụng shell của execlớp phủ với bộ công cụ nosh exec, từ đó sẽ đặt đối số 0 và lớp phủ với chương trình đích:

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

cá rô

Perp của Wayne Marshall bao gồm một runargv0lệnh . Đây là một lệnh bên ngoài thông thường. Vì vậy, người ta có thể chạy nó từ trong tập lệnh Shell Almquist Shell. Để phủ lớp chương trình shell hiện tại, người ta sẽ sử dụng shell của execlớp phủ với bộ công cụ perp runargv0, lần lượt sẽ đặt đối số 0 và lớp phủ với chương trình đích:

thực hiện máy in runargv0.sh "$ argv0"

runit

Runit của Gerrit Pape bao gồm một chpstlệnh . Đây là một lệnh bên ngoài thông thường. Vì vậy, người ta có thể chạy nó từ trong tập lệnh Shell Almquist Shell. Để phủ lớp chương trình shell hiện tại, người ta sẽ sử dụng shell của execlớp phủ với runit chpst, do đó sẽ đặt đối số 0 và lớp phủ với chương trình đích:

exec chpst -b "$ argv0" máy in.sh


1
Là một người tị nạn từ runitmiễn cưỡng chuyển sang systemd, tôi rất vui khi được giới thiệu nosh. Cảm ơn nhiều!
Charles Duffy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.