Чи є спосіб POSIX встановити нульовий аргумент цільової програми?


21

У bashви можете використовувати exec -aі zshви можете альтернативно встановити ARGV0для виконання програми з певним нульовим аргументом , але є також 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 ), то Шили Bourne Shell (з серпня 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, оболонка MirBSD Korn (до версії R50e ), звичайна оболонка, сумісна з Debian POSIX, та інші оболонки, які не мають розширень для встановлення 0-го аргументу, як це мають оболонки Bourne Again та Z. (Оболонка Korn '93 та оболонка MirBSD Korn від версії R50e далі підтримують -aопцію для вбудованих execкоманд.)

виконувати

Лоран Bercot - хexecline поставляється з в execкоманді . Отже, для дублювання прикладу М. Шазеласа, був би такий execlineсценарій, як

#! / команда / execlineb -P
exec -a zzz ps -f

Беркот, execзвичайно, звичайна зовнішня команда. Таким чином, можна запустити його із сценарію оболонки Debian Almquist. Для накладання поточної програми оболонки використовуйте оболонку execдля накладання з Беркотом exec, що, в свою чергу, встановить 0-й аргумент та накладне на цільову програму:

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

ніш

Набір інструментів nosh включає execкоманду. Щоб дублювати приклад М. Шазеласа, був би такий noshсценарій, як

#! / бін / ніш
exec -a zzz ps -f

Незважаючи на те, що це noshвбудований, це execє також доступно як звичайної зовнішньої команда. Таким чином, можна запустити його із сценарію оболонки Debian Almquist. Для накладання поточної програми оболонки використовуйте оболонку execдля накладання набором інструментів nosh exec, що, в свою чергу, встановить 0-й аргумент і накладне з цільовою програмою:

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

перп

Уейн Маршалл злочинець в включає в runargv0команду . Це звичайна зовнішня команда. Таким чином, можна запустити його із сценарію оболонки Debian Almquist. Для накладання поточної програми оболонки використовуйте оболонку execдля накладання runargv0набором інструментів perp , що, в свою чергу, встановить 0-й аргумент і накладне з цільовою програмою:

exec runargv0 printer.sh "$ argv0"

пробіг

Runit Gerrit Папа включає в chpstкоманду . Це звичайна зовнішня команда. Таким чином, можна запустити його із сценарію оболонки Debian Almquist. Для накладання поточної програми оболонки використовуйте оболонку execдля накладання з runit chpst, що, в свою чергу, встановить 0-й аргумент і накладне з цільовою програмою:

exec chpst -b "$ argv0" printer.sh


1
Оскільки до біженця, з якого runitнеохоче зверталися systemd, я дуже радий, що мене познайомили nosh. Велике дякую!
Чарльз Даффі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.