bash
ではexec -a
を使用でき、zsh
では代わりにARGV0
を設定して特定の0番目の引数でプログラムを実行できますが、POSIXの方法もありますそうする?
提案されたように この1つのコメントで これを達成するための(一時的な)シンボリックリンクを作成できますが、この方法では、新しいゼロ番目の引数値を本当に任意の値に設定できませんでした。特定の絶対パスを使用したコマンド。他の解決策はありますか?
いいえ、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 )以降でサポートされています- 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
完全を期すために、これを行うための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
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
Daniel J. Bernsteinのucspi-tcp には an argv0
コマンド が含まれます。 ( argv0
は djbwares でも使用できます。)これは通常の外部コマンドです。したがって、Debian Almquistシェルスクリプト内から実行できます。現在のシェルプログラムをオーバーレイするには、シェルのexec
を使用してucspi-tcpのargv0
をオーバーレイし、次に0番目の引数を設定してターゲットプログラムをオーバーレイします。
exec argv0 printer.sh "$ argv0"