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


21

bash使用exec -aするzshことができ、代わりにARGV0特定のゼロ引数でプログラムを実行するように設定することもできますが、POSIXの方法もありますか?

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

回答:


27

いいえ、それを行う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サポートされているksh93bashzshbusybox 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

15

完全を期すために、ここの人々が持っているこれを行うためのいくつかのCおよびC ++プログラムであり、すでにコンパイルが。

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

execline

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

パープ

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

exec runargv0 printer.sh "$ argv0"

それを実行します

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

exec chpst -b "$ argv0" printer.sh


1
難民がrunitしぶしぶ向きを変えたのでsystemd、私は紹介されてとてもうれしいですnosh。どうもありがとう!
チャールズダフィー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.