実装する

実装する

bashを使用でき、0番目の引数を使用してプログラムを実行することを選択することもできますが、exec -aこれを行うPOSIXメソッドはありますか?zshARGV0

提案に従ってくださいこのコメントにこれを達成するために(一時的な)シンボリックリンクを作成できますが、新しいゼロ番目の引数値を特定の絶対パスを持つコマンドなどの任意の値に設定することはできません。それでは、他の解決策はありませんか?

答え1

いいえ、Cプログラムをコンパイルする以外にこれを行うPOSIXメソッドはありません。迅速で汚れたアプローチ:

$ 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 -aksh93、、、、(バージョン1.27.0以降)、、bash(サポートzshbusybox ashyashmkshr50eバージョンから開始)、これヒリーバーンシェル(2015年8月現在) したがって、貝殻の中で最も広く使用されている貝殻です。

おそらく最も移植性の高い方法は、perlCコンパイラよりも便利なコンパイラを使用することです。

$ 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

答え2

完全性を期すために、人々がこれを行ういくつかのCおよびC ++プログラムは次のとおりです。すでに編む。

あなたが指摘したコメントによると、「POSIX方式」を要求した明らかな動機は、Debian Almquistシェル、MirBSD Kornシェル(以前のバージョンR50e)などのシェルを使用して同じ目標を達成する方法を理解することです。 Debian POSIX準拠の汎用シェルやBourne AgainやZシェルなど、ゼロ番目の引数を設定する拡張子のない他のシェル。 ('93 KornシェルとR50eバージョンで始まるMirBSD Kornシェルは、組み込みコマンドの-aオプションexecをサポートしています。)

実装する

ローランベルコexecline付属execコマンド。したがって、M. Chazelasの例を複製するにはexeclineスクリプトが必要です。

#!/コマンド/execlineb -P
-a zzz ps -f を実行します。

execもちろんベルコは一般的な外部命令です。したがって、Debian Almquist Shellスクリプトで実行できます。現在のシェルプログラムを上書きするには、シェルを使用してexecBercotをオーバーライドするexecと、0番目の引数を設定してターゲットプログラムを上書きします。

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

おやつ

スナックツールセット含むexecコマンド。 M. Chazelasの例を複製するには、次noshのスクリプトが必要です。

#!/空/ノッシュ
-a zzz ps -f を実行します。

nosh内蔵されていますがexec返品一般的な外部コマンドでアクセスできます。したがって、Debian Almquist Shellスクリプトで実行できます。現在のシェルプログラムを上書きするには、execnoshツールセットとしてシェルの上書きを使用できますexec。これにより、0番目のパラメータが設定され、ターゲットプログラムで上書きされます。

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

犯人

ウェイン・マーシャルの犯罪含むrunargv0コマンド。これは一般的な外部コマンドです。したがって、Debian Almquist Shellスクリプトで実行できます。現在のシェルプログラムを上書きするには、shellexecとperpツールセットを使用して上書きするだけですrunargv0。これにより、0番目のパラメータが設定され、ターゲットプログラムで上書きされます。

runargv0 Printer.sh "$argv0" 実行

走る

ゲレットペプのルネット含むchpstコマンド。これは一般的な外部コマンドです。したがって、Debian Almquist Shellスクリプトで実行できます。現在のシェルプログラムを上書きするには、execrunit overrideでシェルを使用できますchpst。これにより、0番目のパラメータが設定され、ターゲットプログラムで上書きされます。

chpst -b "$argv0" Printer.sh 実行

ucspi TCPプロトコル

Daniel J. Bernsteinによるucspi-tcp含むargv0コマンド。 (argv0次のターゲットにも利用可能DJBウェア.) これは一般的な外部コマンドです。したがって、Debian Almquist Shellスクリプトで実行できます。現在のシェルプログラムを上書きするには、execucspi-tcpでシェルを使用して上書きできますargv0。これにより、0番目のパラメータが設定され、ターゲットプログラムで上書きされます。

argv0プリンタ.sh "$argv0"を実行する

関連情報