次のような実行可能な Ruby スクリプトがあります。
例:
#!/usr/bin/env ruby
at_exit do
# Replace the currently running Ruby process with a new instance of the parent shell
exec(`ps -p #{Process.ppid} -o comm=`.chomp)
end
コマンドとして実行する場合は正常に動作しますが、それ自体を新しいシェル インスタンスに置き換えるため、実行後にコマンドが実行されないため、スクリプトでは動作しません。
実行を継続できるようにシェル スクリプトを変更するにはどうすればよいですか?
(私は次のようにシェルスクリプトを実行しています: bash test.sh)
私が達成したいことのいくつかの例:
テスト.sh:
#!/usr/bin/bash
./example && echo "How do i get here"
テスト1.sh:
#!/usr/bin/bash
VAR=foo
$VAR ./example <argument>
テスト2.sh:
#!/usr/bin/bash
cd ~ && git clone https://github.com/gfxstrand/pycook
yes | ./example
テスト3.sh:
#!/usr/bin/bash
./example || echo "How do i get here"
Ruby スクリプトの動作は変更できないことに注意してください。終了時に、Ruby スクリプト自体を親シェルの新しいインスタンスに置き換える必要があります。 (例外は、Ruby スクリプトの親プロセスを親シェルの新しいインスタンスに置き換えるソリューションですが、これでも十分です)
最も単純な解決策ではないかもしれませんが、
(sh -c ./example & wait)
機能するはずです。 example がそれ自体を親 sh プロセスに置き換えると、このプロセスはすぐに終了し、祖父母は気にならなくなります。