で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 -f
exec -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にはrunargv0
commandが含まれています。これは通常の外部コマンドです。したがって、Debian Almquist Shellスクリプト内から実行できます。現在のシェルプログラムをオーバーレイするには、シェルを使用exec
してperpツールセットをオーバーレイしますrunargv0
。これにより、0番目の引数が設定され、ターゲットプログラムがオーバーレイされます。
exec runargv0 printer.sh "$ argv0"
Gerrit Papeのrunitにはchpst
commandが含まれています。これは通常の外部コマンドです。したがって、Debian Almquist Shellスクリプト内から実行できます。現在のシェルプログラムをオーバーレイするには、シェルを使用exec
してrunitをオーバーレイしますchpst
。これにより、0番目の引数が設定され、ターゲットプログラムがオーバーレイされます。
exec chpst -b "$ argv0" printer.sh
runit
しぶしぶ向きを変えたのでsystemd
、私は紹介されてとてもうれしいですnosh
。どうもありがとう!