
私の機能があります~/.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
答え2
私にとって非常に簡単な解決策は、Invoke an Interactive Shellを使用することでした。sudo -s
これは私のmacOSバンドルバージョンのzsh(5.2)で動作するようです。これは私に~/.zshrc
。
sudo のマニュアルページによると、実際にこの動作を意味するわけではありません。
-s、--shell
SHELL環境変数(設定されている場合)で指定されたシェル、または呼び出し元のユーザーのパスワードデータベースエントリで指定されたシェルを実行します。コマンドを指定すると、シェルの -c オプションで実行できるようにシェルに渡されます。コマンドを指定しないと、対話型シェルが実行されます。
あなたのユースケースが何であるかはわかりませんが、インタラクティブなソリューションを探しているようです。
答え3
再利用できるようにしました。速記Stéphane Chazelasに記載されているソリューションの1つ回答。 [編集:私が思いついたオリジナルのショートカットを繰り返したStéphane。ここで説明されているコードは、彼が作成した更新版です。
これをあなたの~/.zshrc
:
sdo() sudo zsh -c "$functions[$1]" "$@"
sdo
これで、「sudo
カスタム関数のみ」として使用できるようになります。
機能していることを確認するにはsdo
:ユーザー名を印刷するカスタム関数でこれを試すことができます。
➜ birch@server ~/
答え4
これは私にとって効果的なようです。
function sudo (){
args="$@"
/run/wrappers/bin/sudo -u "$USER" zsh -i -c "$args"
}