入力を許可するbashスクリプトでsedの出力を実行します。

入力を許可するbashスクリプトでsedの出力を実行します。
sed 's/docker/sudo docker/g' ./generate.sh | xargs bash

呼び出し時に実行されるように、すべての呼び出しを置き換えるgenerate.shスクリプトを実行したいと思います。また、ユーザー入力が必要です。それでは、どのように機能させますか?ファイルを保存できず、端末のみ使用できます。dockersudo dockerbash generate.sh

答え1

@Freddyの現在削除された回答について述べたように、一時的に生成されたスクリプトへのパスが現在の作業ディレクトリにあることも重要です。スクリプトは、独自のパスに基づいて他のリソースを探し、これらの操作は実行されないためです。始める:

bash <(sed 's/docker/sudo docker/g' ./generate.sh)

スクリプトのパスは/dev/fd/63または同じで、スクリプトは/tmp/some-temporary-named-pipe現在作業ディレクトリがあるディレクトリ内またはその代わりにリソースを探します。/dev/fd/tmpgenerate.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

代わりにdockercall を再定義してください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)

関連情報