私の機能があります~/.zshrc
。
findPort() {
lsof -t -i :$1
}
一般的な呼び出しはですfindPort 3306
。
より高い権限で実行したいです。しかし、「コマンドが見つかりません」というメッセージが表示されます。
➜ git
ベストアンサー1
sudo
シェルを介さずに直接コマンドを実行し、コマンドを実行するためにシェルを実行してもコマンドを読み取る代わりに新しいシェルが呼び出されます~/.zshrc
(対話型シェルを起動しても、ユーザーのコマンドではなくroot
fetchを読み取ることができます)。変数をリセットしないように~/.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