sudo가 별칭을 무시하는 이유는 무엇입니까?


22

Ubuntu 10.04를 실행 중이며 upstart데몬 관리에 사용 합니다. 엔터프라이즈 응용 프로그램은 데몬으로 실행되며 다양한 권한으로 인해 루트로 실행해야합니다. 예 :

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가 별칭을 무시하는 이유가 여전히 궁금합니다.


뛰었 source ~/.bashrc습니까? 이것은 .bashrc 파일을 업데이트하고 새로운 별칭을 사용할 수있게합니까?
manu

예 @manu, 내가 그랬어
amphibient

답변:


35

여기 에서 아래 정보를 봅니다 .

sudo를 사용할 때 별명 확장을 사용하십시오 (그렇지 않으면 sudo는 별명을 무시합니다)

alias sudo='sudo '

작동하지 않는 이유는 여기 에 설명되어 있습니다 .

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


6

별명과 함수는 쉘에 정의되어 있습니다. Sudo는 외부 프로그램입니다. 따라서 sudo는 별명, 함수 또는 쉘 내장을 보지 않고 외부 명령 만 볼 수 있습니다.

별명은 대체 명령 이름이므로 쉘은 명령에 대한 인수가 아닌 명령 위치에서만 확장합니다. Zsh는 명령 줄의 어느 곳에서나 확장되는 전역 별칭을 지원하며 별칭이 의미가없는 상황에서도 실수로 확장 될 위험이 있으므로 가장 적게 사용하는 것이 가장 좋습니다.

sudo에게 쉘을 호출하도록 지시 할 수 있습니다 : sudo sh -c '…shell command here…'. 그러나 일반적으로 별명은 대화식 쉘에서만 읽 ~/.bashrc거나 ~/.zshrc읽는 파일에 저장되기 때문에 해당 쉘 명령에서 사용할 수 없습니다 .

alias sudo='sudo 'Ramesh 에서 제안한 대로 셸이 별칭을 확장하도록합니다 sudo.


1
alias sudo='sudo 'ZSH에서도 작동 합니까 ?
CMCDragonkai

2
@CMCDragonkai 예
질 'SO- 그만 존재'

1

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에 영구적 인 위치를 갖기에 충분히 유용하다는 것을 알았지 만 별명은 그것을 사용해야 할 때 정의하기에 충분히 간단하다.


0

나는 별명으로 재정의하지 않고 여기에 다른 대답을 주었다 sudo.

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

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

한 줄에 추가 쉘, 별명 재정의 없음. ;-)


아 잠깐만-알 겠어-당신은 xargs따옴표를 제거하고 grep을 사용하여 선행을 제거합니다 =. 영리하지만, 아마도 불필요합니다. eval "sudo $(alias aliasname | cut -d= -f2-)"가능성이 더 낫다 - xargs항상 올바르게 따옴표를 처리하지 않습니다, 더 이상있을 수 =있다한다.
mikeserv

@ mikeserv 당신이 그것을 얻지 못해서 죄송합니다 ;-) xargs따옴표를 제거하지 마십시오. 따옴표 사이에서 해결 된 명령을받는 사람은 grep입니다. 당신은 type -a alias_name같은 것을 반환한다는 것을 알고 alias_name is aliased to command_within_quotes있습니다. 그건 그렇고 내가 당신의 명령을 시도하고 내 우분투에서 작동하지 않았다 :-(. type -a리눅스 버전 사이 에 다른 반환 합니까? (의심))
loved.by.Jesus

나는 무엇인지 type에 - 않습니다 bash. 당신은 따옴표가 두 배로 맞다 는 것을 이해 합니까? 작은 따옴표가 포함 된 별칭으로 시도해 보셨습니까? 어쨌든, 당신은 내가 작동하지 않는 것에 대해 옳습니다 . eval "sudo sh -c "$(...또는 eval "'sudo $(alias alias_name| cut -d\' -f2-)". 문제는 alias기본적으로 미리 정해져 있습니다 eval- alias유틸리티는 쉘에 안전하게 다시 입력 할 수 있도록 내용을 출력하도록 지정되어 있습니다. xargs공백을 평평하게하기 위해 구현 된 것 같아요 ? 조심해, 알았지?
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.