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
답변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
한 줄에 모두 포함되어 있으며 추가 셸이나 별칭 재정의가 없습니다. ;-)