
bash
を使用でき、0番目の引数を使用してプログラムを実行することを選択することもできますが、exec -a
これを行うPOSIXメソッドはありますか?zsh
ARGV0
提案に従ってくださいこのコメントにこれを達成するために(一時的な)シンボリックリンクを作成できますが、新しいゼロ番目の引数値を特定の絶対パスを持つコマンドなどの任意の値に設定することはできません。それでは、他の解決策はありませんか?
答え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 -a
ksh93
、、、、(バージョン1.27.0以降)、、bash
(サポートzsh
busybox ash
yash
mksh
r50eバージョンから開始)、これヒリーバーンシェル(2015年8月現在) したがって、貝殻の中で最も広く使用されている貝殻です。
おそらく最も移植性の高い方法は、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
答え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スクリプトで実行できます。現在のシェルプログラムを上書きするには、シェルを使用してexec
Bercotをオーバーライドするexec
と、0番目の引数を設定してターゲットプログラムを上書きします。
exec /command/exec -a "$argv0" Printer.sh
おやつ
スナックツールセット含むexec
コマンド。 M. Chazelasの例を複製するには、次nosh
のスクリプトが必要です。
#!/空/ノッシュ -a zzz ps -f を実行します。
nosh
内蔵されていますがexec
、返品一般的な外部コマンドでアクセスできます。したがって、Debian Almquist Shellスクリプトで実行できます。現在のシェルプログラムを上書きするには、exec
noshツールセットとしてシェルの上書きを使用できます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スクリプトで実行できます。現在のシェルプログラムを上書きするには、exec
runit overrideでシェルを使用できますchpst
。これにより、0番目のパラメータが設定され、ターゲットプログラムで上書きされます。
chpst -b "$argv0" Printer.sh 実行
ucspi TCPプロトコル
Daniel J. Bernsteinによるucspi-tcp含むargv0
コマンド。 (argv0
次のターゲットにも利用可能DJBウェア.) これは一般的な外部コマンドです。したがって、Debian Almquist Shellスクリプトで実行できます。現在のシェルプログラムを上書きするには、exec
ucspi-tcpでシェルを使用して上書きできますargv0
。これにより、0番目のパラメータが設定され、ターゲットプログラムで上書きされます。
argv0プリンタ.sh "$argv0"を実行する