web-dev-qa-db-ja.com

ターゲットアプリケーションのゼロ番目の引数を設定するPOSIXの方法はありますか?

bashではexec -aを使用でき、zshでは代わりにARGV0を設定して特定の0番目の引数でプログラムを実行できますが、POSIXの方法もありますそうする?

提案されたように この1つのコメントで これを達成するための(一時的な)シンボリックリンクを作成できますが、この方法では、新しいゼロ番目の引数値を本当に任意の値に設定できませんでした。特定の絶対パスを使用したコマンド。他の解決策はありますか?

21
phk

いいえ、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は、ksh93bashzshbusybox ash(バージョン1.27.0以降)、yashmkshバージョンr50e )以降でサポートされています- Schily Bourne Shell (2015年8月以降)シェルの中で最も普及しています。

おそらく、最も移植性の高い方法は、Cコンパイラよりも利用しやすい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
27

完全を期すために、これを行うためのCおよびC++プログラムを以下に示します。これらは、がすでにコンパイルされています。

あなたが指摘している解説によると、これを行う「POSIXの方法」を求める動機は、Debian Almquistシェル、MirBSD Kornシェル(バージョンR50eより前)などのシェルで同じ目的を達成する方法を知ることです。 )、Debian POSIX準拠の通常のシェル、およびBourne AgainおよびZシェルのように0番目の引数を設定するための拡張機能がない他のシェル。 ('93 Kornシェル、およびバージョンR50e以降のMirBSD Kornシェルは、組み込みのexecコマンドに対して-aオプションをサポートしています。)

エグゼクティブ

Laurent Bercotのexecline には an execコマンド が付属しています。したがって、M。Chazelasの例を複製するには、次のような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ツールセット には an execコマンド が含まれます。 M. Chazelasの例を複製するには、次のようなnoshスクリプトを使用します。

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

これはnosh組み込みですが、このexecは通常の外部コマンドとしてまたにアクセスできます。したがって、Debian Almquistシェルスクリプト内から実行できます。現在のシェルプログラムをオーバーレイするには、シェルのexecを使用してnoshツールセットのexecをオーバーレイし、次に0番目の引数を設定してターゲットプログラムをオーバーレイします。

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

perp

Wayne Marshallのperp には a runargv0コマンド が含まれます。これは通常の外部コマンドです。したがって、Debian Almquistシェルスクリプト内から実行できます。現在のシェルプログラムをオーバーレイするには、シェルのexecを使用してperpツールセットのrunargv0をオーバーレイし、次に0番目の引数を設定してターゲットプログラムをオーバーレイします。

exec runargv0 printer.sh "$ argv0"

それを実行します

Gerrit Papeのrunit には a chpstコマンド が含まれます。これは通常の外部コマンドです。したがって、Debian Almquistシェルスクリプト内から実行できます。現在のシェルプログラムをオーバーレイするには、シェルのexecを使用してrunitのchpstをオーバーレイし、次に0番目の引数を設定してターゲットプログラムをオーバーレイします。

exec chpst -b "$ argv0" printer.sh

ucspi-tcp

Daniel J. Bernsteinのucspi-tcp には an argv0コマンド が含まれます。 ( argv0djbwares でも使用できます。)これは通常の外部コマンドです。したがって、Debian Almquistシェルスクリプト内から実行できます。現在のシェルプログラムをオーバーレイするには、シェルのexecを使用してucspi-tcpのargv0をオーバーレイし、次に0番目の引数を設定してターゲットプログラムをオーバーレイします。

exec argv0 printer.sh "$ argv0"
15
JdeBP