zsh 사용자를 위한 솔루션

zsh 사용자를 위한 솔루션

upstart데몬 관리를 위해 Ubuntu 10.04를 실행하고 있습니다 . 내 엔터프라이즈 응용 프로그램은 데몬으로 실행되며 다양한 권한으로 인해 루트로 실행되어야 합니다. 예를 들어:

sudo start my-application-long-ID
sudo stop my-application-long-ID
etc

alias다음 명령의 약어를 소개하고 싶습니다 .

alias startapp='sudo start my-application-long-ID'

작동하도록 실행 startapp하지만 별칭에 sudo를 사용하고 싶지 않습니다.

alias startapp='start my-application-long-ID'

런타임에 사용되지 않으면 를 sudo startapp반환합니다 sudo: startapp: command not found.

그러나 별칭을 추가하면 다음과 같습니다.

alias sudo='sudo '

sudo startapp지금은 작동하지만 sudo가 별칭을 무시하는 이유가 여전히 궁금합니다.

답변1

다음 정보를 확인했습니다.여기.

sudo를 사용할 때 별칭 확장을 사용하세요. 그렇지 않으면 sudo가 별칭을 무시합니다.

alias sudo='sudo '

작동하지 않는 이유를 설명했습니다.여기.

Bash는 별칭 명령의 첫 번째 단어만 확인하고 그 이후의 단어는 확인하지 않습니다. 즉, sudo ll과 같은 명령에서 bash는 첫 번째 단어(sudo)에서만 별칭을 확인하고 ll은 무시됩니다. 별칭 값 끝에 공백을 추가하여 bash에게 별칭(예: sudo) 뒤의 다음 단어를 확인하도록 지시할 수 있습니다.

답변2

별칭과 함수는 셸에서 정의됩니다. Sudo는 외부 프로그램입니다. 따라서 sudo는 별칭, 함수 또는 셸 내장 명령을 볼 수 없으며 외부 명령만 볼 수 있습니다.

별칭은 대체 명령 이름이므로 셸은 명령에 대한 인수일 때가 아닌 명령 위치에서만 별칭을 확장합니다. Zsh는 명령줄 어디에서나 확장할 수 있는 전역 별칭을 지원하며, 별칭이 의미가 없는 상황에서도 실수로 확장할 위험이 있으므로 주의해서 사용하는 것이 가장 좋습니다.

sudo에게 shell: 을 호출하라고 지시할 수 있습니다 sudo sh -c '…shell command here…'. 그러나 일반적인 별칭은 일반적으로 대화형 셸에서만 읽을 수 있는 ~/.bashrc또는 같은 파일 에 저장되므로 이 셸 명령에서는 사용할 수 없습니다.~/.zshrc

alias sudo='sudo ', 처럼라메쉬가 제안함, 쉘이 나중에 별칭을 확장하게 만듭니다 sudo.

답변3

zsh 사용자를 위한 솔루션

Bash 및 zsh에서 별칭을 공백으로 끝내면 쉘 별칭이 다음 단어로 확장됩니다. 이를 통해 다음과 같은 별칭 확장이 가능합니다.myalias

alias 'sudo=sudo '
sudo myalias

안타깝게도 별칭에 여러 단어가 포함된 경우(예:) 이 문제가 발생합니다. sudo -u someone그러나 zsh "전역 별칭" 기능을 남용하여 명령의 어느 곳에서나 별칭을 수동으로 확장할 수 있습니다.

alias -g '$= '

$이렇게 하면 공백으로 끝나는 이름의 전역 별칭(원하는 단어를 사용할 수 있음)이 생성됩니다 . 이로 인해 zsh는 다음 단어를 일반 명령 별칭으로 확장합니다. 별칭은 공백으로 확장되므로 매개변수로 간주되지 않습니다. 이를 통해 다음이 작동할 수 있습니다.

% alias myalias=echo
% sudo -u someone myalias foo
sudo: myalias: command not found
% sudo -u someone $ myalias foo
foo

$복잡한 명령 중첩이 있는 경우 단일 명령줄에서 여러 번 사용할 수도 있습니다 . 내 zshrc에 영구 위치가 있다는 점이 매우 유용하다고 생각하지만 별칭은 사용해야 할 때 정의할 수 있을 만큼 간단합니다.

답변4

방금 다른 대답을 했어요여기별칭을 사용하여 재정의할 필요가 없습니다 sudo.

귀하의 경우에는 다음과 같습니다:

type -a startapp | grep -o -P "(?<=\`).*(?=')" | xargs sudo 

한 줄에 모두 포함되어 있으며 추가 셸이나 별칭 재정의가 없습니다. ;-)

관련 정보