私はシェルスクリプト(arch-chroot
Arch Linuxで)を持っています。arch-install-scripts
パッケージ)、起動時に最後の行から始まりますchroot
。chroot
SHELL=/bin/sh unshare --fork --pid chroot "$chrootdir" "$@"
私のユースケースでは、まったく同じスクリプトを使用し、最後の行に「パッチ」を追加したいと思います。
SHELL=/bin/bash chroot "$chrootdir" "$@"
これを行う最良の方法は何ですか?重要な場合は、arch-chroot
root権限でスクリプトを実行する必要があります。今パッチされたスクリプトのコピーだけが残りました。元のスクリプトが更新されると、パッチされたバージョンは「古い」になります。必要に応じて一時的な場所にコピーしてパッチを適用することもできますが、それが良いかどうかはわかりません。
スクリプトを一時的にパッチする方法はありますか?
元のスクリプトは、そのスクリプトが属するパッケージが更新されたときにのみ変更されます。私の目標は、元のスクリプトを変更せずに元のスクリプトの最新バージョンのパッチバージョンを呼び出す方法を持つことです。
答え1
簡単で粗大な回避策は、元のファイルの変更されたコピーで一時ファイルを生成し、tmpfileを実行arch-chroot
する小さなスクリプトを作成することです。たとえば、
#!/bin/sh
scriptfile=$(mktemp /tmp/tempscript.XXXXX)
sed 's#SHELL=.*#SHELL=/bin/bash chroot "$chrootdir" "$@"#' /usr/bin/arch-chroot > $scriptfile
$scriptfile "$@"
1行だけが文字列と一致すると仮定します。行が多いか、行がないとSHELL=
自動的に失敗します。/usr/bin/arch-chroot
答え2
使用しているスクリプトがオペレーティングシステムの展開に付属している場合は、更新される可能性が非常に高くなります。ソーススクリプトの最後の行を削除し、カスタム行を最後に追加するラッパースクリプトをこのソーススクリプトの周りに作成することをお勧めします。次に、新しく作成されたコピーを呼び出します。私はこれが最も簡単な方法だと思います。
mv original_script original_script.orig # make a backup copy of original
sed -i '$ d' original_script.orig > original_script # remove last line
echo 'SHELL=/bin/bash chroot "$chrootdir" "$@"' >> original_script # add your line to the end
original_script # run the script
mv original_script.orig original_script #restore the original in place
答え3
この目的のために独自の修正パッケージを作成してください。最新の状態に保つように注意し、自動更新を避けるために、ディストリビューション関連のトリックを使用することもできます。
(アーチについての知識もなく)あなたが提案した変更の理由を理解していませんが、一見すると何をすべきかがわかります。いいえセキュリティ上の理由から、またはお客様のユースケースがどのような方法でもこの機能を有効にするためのアップストリームパッチを保証するのに十分な関連性がある可能性があります。どちらの場合も、ディストリビューションのバグ報告/改善要求システムを通じて知識豊富な人と話し合うことをお勧めします。
または、ここで達成したいものを議論してください(この質問のようにこれを達成する方法ではありません)。