~/.zshrcでsudo関数を実行すると、「コマンドが見つかりません」

~/.zshrcでsudo関数を実行すると、「コマンドが見つかりません」

私の機能があります~/.zshrc

findPort() {
    lsof -t -i :$1
}

一般的な呼び出しはですfindPort 3306

より高い権限で実行したいです。しかし、「コマンドが見つかりません」というメッセージが表示されます。

➜  git 

ベストアンサー1

sudoシェルを介さずに直接コマンドを実行し、コマンドを実行するためにシェルを実行してもコマンドを読み取る代わりに新しいシェルが呼び出されます~/.zshrc(対話型シェルを起動しても、ユーザーのコマンドではなくrootfetchを読み取ることができます)。変数をリセットしないように~/.zshrc設定しない限り)。sudo$HOME

ここでは、sudo新しいシェルを起動してzsh関数を実行する前にコンテンツをzsh読み取るように指示する必要があります~/.zshrc

sudo zsh -c '. $0; "$@"' ~/.zshrc findPort 3306

または:

sudo zsh -c '. $0; findPort 3306' ~/.zshrc

zshまたは、現在のzsh関数を次の新しい関数と共有しますsudo

sudo zsh -c "$(functions); findPort 3306"

あなたは引数のリストが長すぎます。多くの関数が定義されている場合(完成システムを使用している場合など)、エラーが発生します。したがって、このfindPort関数(およびその関数が依存する他のすべての関数(存在する場合))に制限したい場合があります。

sudo zsh -c "$(functions findPort); findPort 3306"

次のようにすることもできます。

sudo zsh -c "(){$functions[findPort]} 3306"

関数findPortコード匿名関数3306パラメータを渡します。でも:

sudo zsh -c "$functions[findPort]" findPort 3306

(インラインスクリプトが次に渡されました。-c はい関数本体)。

以下のヘルパー機能を使用できます。

zsudo() sudo zsh -c "$functions[$1]" "$@"

使用しないでください。

sdo() { sudo zsh -c "(){$functions[$1]} ${@:2}" }

パラメータはsdo異なるレベルのシェル解析を経るためです。比較する:

$ e() echo "$@"
$ sdo e 'tname;uname'
tname
Linux
$ zsudo e 'tname;uname'
tname;uname

おすすめ記事