Есть ли способ POSIX для установки нулевого аргумента целевого приложения?

21

В качестве альтернативы bashвы можете использовать exec -aи zshможете также ARGV0запускать программу с определенным нулевым аргументом, но есть ли способ POSIX сделать это?

Как предлагается в этом одном комментарии, вы могли бы создать (временную) символическую ссылку для достижения этой цели, но таким образом я не мог установить новое нулевое значение аргумента в истинно любое произвольное значение, например команду с определенным абсолютным путем. Так есть ли другое решение?

PHK
источник

Ответы:

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что более вероятно, чем компилятор Си.

$ 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команд.)

execline

Лоран Bercot - хexecline поставляется с в execкоманде . Таким образом, чтобы дублировать пример М. Чазеласа, нужно иметь такой execlineсценарий, как

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

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

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

перекус

В набор инструментов nosh входит execкоманда. Чтобы дублировать пример М. Чазеласа, можно было бы noshнаписать такой сценарий, как

#! / Bin / перекус
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нужно использовать оболочки для наложения на набор инструментов perp runargv0, который, в свою очередь, установит 0-й аргумент и наложит на целевую программу:

exec runargv0 printer.sh "$ argv0"

запустить его

Рунит Геррита Папе включает вchpst себя команду . Это обычная внешняя команда. Таким образом, его можно запустить из сценария оболочки Debian Almquist. Чтобы наложить текущую программу оболочки, execнужно использовать оболочки для наложения с помощью runit chpst, что, в свою очередь, установит 0-й аргумент и наложение на целевую программу:

exec chpst -b "$ argv0" printer.sh

JdeBP
источник
1
Как беженец из runitнеохотно повернулся systemd, я очень рад, что меня представили nosh. Большое спасибо!
Чарльз Даффи