でbash使用exec -aするzshことができ、代わりにARGV0特定のゼロ引数でプログラムを実行するように設定することもできますが、POSIXの方法もありますか?
この1つのコメントで示唆されているように、これを達成するための(一時的な)シンボリックリンクを作成できますが、この方法では、新しいゼロ番目の引数値を真に任意の値、たとえば特定の絶対パスを持つコマンドに設定できませんでした。他の解決策はありますか?
でbash使用exec -aするzshことができ、代わりにARGV0特定のゼロ引数でプログラムを実行するように設定することもできますが、POSIXの方法もありますか?
この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 -fexec -aサポートされているksh93、bash、zsh、busybox ash(バージョン1.27.0以降)、 、(yash バージョン取り付けThinkPad R50e以降)、シリーのBourneシェル(2015年8月以降)ので、シェルの中で最も普及しているです。mksh
おそらく最も移植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完全を期すために、ここの人々が持っているこれを行うためのいくつかのCおよびC ++プログラムであり、すでにコンパイルが。
あなたが指摘する解説で言えば、これを行うための「POSIXの方法」を求めるためのあなたの明らかな動機は、Debian Almquistシェル、MirBSD Kornシェル(バージョンR50eより前)などのシェルでこの同じ目的を達成する方法を知ることです)、Debian POSIX準拠の通常のシェル、およびBourne AgainおよびZシェルのように0番目の引数を設定するための拡張機能を持たないその他のシェル。('93 Kornシェル、およびバージョンR50e以降のMirBSD Kornシェルは-a、組み込みexecコマンドのオプションをサポートしています。)
Laurent Bercot'sにexeclineはコマンドが付属していexecます。したがって、M。Chazelasの例を複製するには、次のexeclineようなスクリプトが必要です。
#!/ command / execlineb -P exec -a zzz ps -f
execもちろん、ベルコットは普通の外部コマンドです。したがって、Debian Almquist Shellスクリプト内から実行できます。現在のシェルプログラムをオーバーレイするには、シェルを使用execしてBercotをオーバーレイしますexec。これにより、0番目の引数が設定され、ターゲットプログラムがオーバーレイされます。
exec / command / exec -a "$ argv0" printer.sh
noshツールセットにはexecコマンドが含まれています。M.シャゼラスの例を複製するには、次のnoshようなスクリプトが必要です。
#!/ bin / nosh exec -a zzz ps -f
これはnosh組み込みexecですが、通常の外部コマンドとしてもアクセスできます。したがって、Debian Almquist Shellスクリプト内から実行できます。現在のシェルプログラムをオーバーレイするには、シェルを使用execしてnoshツールセットをオーバーレイしますexec。これにより、0番目の引数が設定され、ターゲットプログラムがオーバーレイされます。
exec / usr / local / bin / exec -a "$ argv0" printer.sh
ウェインマーシャルのperpにはrunargv0commandが含まれています。これは通常の外部コマンドです。したがって、Debian Almquist Shellスクリプト内から実行できます。現在のシェルプログラムをオーバーレイするには、シェルを使用execしてperpツールセットをオーバーレイしますrunargv0。これにより、0番目の引数が設定され、ターゲットプログラムがオーバーレイされます。
exec runargv0 printer.sh "$ argv0"
Gerrit Papeのrunitにはchpstcommandが含まれています。これは通常の外部コマンドです。したがって、Debian Almquist Shellスクリプト内から実行できます。現在のシェルプログラムをオーバーレイするには、シェルを使用execしてrunitをオーバーレイしますchpst。これにより、0番目の引数が設定され、ターゲットプログラムがオーバーレイされます。
exec chpst -b "$ argv0" printer.sh
runitしぶしぶ向きを変えたのでsystemd、私は紹介されてとてもうれしいですnosh。どうもありがとう!