~/.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

답변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"
}

관련 정보