내 기능이 있습니다 ~/.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에 설명된 솔루션 중 하나답변. [편집: 내가 생각해낸 원래 단축키를 반복한 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"
}