sed 's/docker/sudo docker/g' ./generate.sh | xargs bash
呼び出し時に実行されるように、すべての呼び出しを置き換えるgenerate.sh
スクリプトを実行したいと思います。また、ユーザー入力が必要です。それでは、どのように機能させますか?ファイルを保存できず、端末のみ使用できます。docker
sudo docker
bash generate.sh
答え1
@Freddyの現在削除された回答について述べたように、一時的に生成されたスクリプトへのパスが現在の作業ディレクトリにあることも重要です。スクリプトは、独自のパスに基づいて他のリソースを探し、これらの操作は実行されないためです。始める:
bash <(sed 's/docker/sudo docker/g' ./generate.sh)
スクリプトのパスは/dev/fd/63
または同じで、スクリプトは/tmp/some-temporary-named-pipe
現在作業ディレクトリがあるディレクトリ内またはその代わりにリソースを探します。/dev/fd
/tmp
generate.sh
ただし、zshでは次のことができます。
TMPPREFIX=$PWD/.transformed-
bash =(sed 's/docker/sudo &/g' ./generate.sh)
コマンド置換形式はパイプの=(...)
代わりに一時ファイルを使用し、それを/dev/fd/x
使用する方法$TMPPREFIX
と$TMPSUFFIX
変数名を指定できます。
local
または、匿名関数でly変数を変更してください。
() { local TMPPREFIX=$PWD/.transformed-
bash =(sed 's/docker/sudo &/g' ./generate.sh)
}
Bashでは、次のことができます。
docker() { sudo docker "$@"; }
export -f docker
bash ./generate.sh
代わりにdocker
call を再定義してくださいsudo docker
。
ただし、エクスポートされた関数は最終的にこのスクリプトで実行される他のコマンドにもエクスポートされます。
追加の拡散リスクを制限するには、初回使用時にエクスポートをキャンセルすることが賢明かもしれません。
docker() {
typeset -f +x docker
sudo docker "$@"
}
export -f docker
bash ./generate.sh
エクスポートされた関数はとにかく維持されないことに注意してくださいsudo
(神に感謝します!)。
または以下を使用してください。
bash -c 'docker() { sudo docker "$@"; }; . ./generate.sh'
これはうまくいきますsh
(.sh
拡張子はこれがshスクリプトであることを示します):
sh -c 'docker() { sudo docker "$@"; }; . ./generate.sh' ./generate.sh
2番目は./generate.sh
インラインスクリプトに渡されます$0
(おそらくスクリプトが自分のパスが何であるかを学ぶ場所です)。
スクリプトが十分に短い場合は、sed
出力をインラインスクリプト全体に渡すことができます。
bash -c "$(sed 's/docker/sudo &/g' ./generate.sh)" ./generate.sh
ksh エミュレーションではzsh
ほとんどの bash スクリプトを解釈できますが、zsh を使用すると、これをオーバーライドして次のことが$0
できます。
zsh --emulate ksh <(
echo '0=./generate.sh'; sed 's/docker/sudo &/g' ./generate.sh)