별칭 sudo = 'nocorrect sudo'를 올바르게 설정하는 방법은 무엇입니까?


5

최근까지 나는 alias sudo='sudo '.zshrc파일에 있었다 . 오늘 나는 시도하려고 할 때이 오류에 부딪쳤다 sudo mv.

  ~  sudo mv nginx.conf.orig nginx.conf.orig2
sudo: nocorrect: command not found

이제 인터넷 검색을 통해 이것이 접두사가 붙은 일부 명령 nocorrect과 관련이 있고로 해결할 수 있음을 알았습니다 alias sudo='nocorrect sudo'.

그러나 alias sudo='nocorrect sudo '추가 별칭을 사용할 수 있도록 별칭을 설정하려고 할 때 문제가 발생 합니다. 또한 여기에 언급 된대로 내 su가 zsh를 사용하고 있는지 확인했습니다 .

  ~  alias sudo='nocorrect sudo '            
  ~  sudo mv nginx.conf.orig nginx.conf.orig2
sudo: nocorrect: command not found
  ~  alias sudo='nocorrect sudo'                           
  ~  sudo mv nginx.conf.orig nginx.conf.orig2
  ~  su
Password: 
michaelarch# ps -p $$
  PID TTY          TIME CMD
25831 pts/1    00:00:00 zsh

누구든지 이것을 해결하는 방법에 대한 제안이 있습니까?

편집 : alias sudo='sudo 'sudo 명령과 함께 별칭을 사용할 수 있습니다. 예를 들어 아래를 참조하십시오.

  ~  alias cat='echo hello'     
  ~  echo goodbye > example.txt
  ~  cat example.txt           
hello example.txt
  ~  sudo cat example.txt 
goodbye
  ~  alias sudo='sudo '
  ~  sudo cat example.txt
hello example.txt

내 쉘에 대한 자세한 내용은 다음을 참조하십시오.

  ~  sudo chsh                               
Changing shell for root.
New shell [/usr/bin/zsh]:    
  ~  unalias sudo; alias sudo='nocorrect sudo '
  ~  echo $SHELL; which sudo                   
/usr/bin/zsh
sudo: aliased to nocorrect sudo 
  ~  sudo mv nginx.conf.orig2 nginx.conf.orig  
sudo: nocorrect: command not found
  ~  which mv
mv: aliased to nocorrect mv

1
의 목적은 alias sudo='sudo '무엇입니까?
mpy

@mpy 당신이 할 수없는 sudo와 함께 다른 별칭 명령을 사용할 수있게 해줍니다. 예를 들어 보겠습니다.
Mike HR

알겠습니다 ... 이것이 문제라고 생각합니다. sudo별명을 정의한 다음 위에nocorrect sudo 별명 정의하십시오 . 그래서 마침내 쉘이 내장 된 것처럼 sudo nocorrect sudo ...실행되고 당신 sudo: nocorrect: command not found을 던집니다 nocorrect. 시도하십시오 unalias sudo; alias sudo='nocorrect sudo '.
mpy

@mpy 좋은 생각. 내가 당신이 옳다고 생각하지만 불행히도 그것을 시도하면 작동하지 않았다 :unalias sudo; alias sudo='nocorrect sudo '; ➜ ~ sudo mv nginx.conf.orig2 nginx.conf.orig sudo: nocorrect: command not found
Mike HR

무엇 않습니다 echo $SHELL; which sudo말?
mpy

답변:


6

다음과 같은 동작을 재현 할 수 있습니다.

alias sudo='nocorrect sudo '
alias mv='nocorrect mv '

따라서 실행 sudo mv foo bar하면 확장됩니다.

nocorrect sudo nocorrect mv foo bar

nocorrect 가 쉘 예약어이고 sudo로 처리 할 수 ​​없으므로 오류가 발생 합니다.

mv 별칭이 확장되는 이유 alias sudo='nocorrect sudo '는 후행 공백으로 정의 하여 나중에 별칭 확장을 가능하게하기 때문입니다. 후행 공백이 없으면이 예제가 작동하지만 sudo를 완전히 사용한 후에 별칭을 사용하는 기능이 느슨해집니다.

sudo 다음에 별칭 확장을 일반적으로 사용하지만 sudo와 함께 사용할 때 명령 을 sudo mv이스케이프하면 오류가 발생하지 않도록하는 해결 방법 mv:

sudo \mv foo bar

이것은 mv의 별칭 확장을 방지합니다.


@Mike HR 올바른 완료 도구를 사용하지 않고 mv 별칭이 필요하지 않은 mv에 zstyle을 정의하여 문제를보다 우아하게 해결할 수 있다고 확신합니다 . 그것은 단지 아이디어 일 뿐이며, 나는 그것에 대해 프로가 아니므로 그 접근법에 대한 코드를 포함시키지 않은 이유입니다. Btw. 다만 확인하십시오 : 당신은 모든 명령 _and 수정하는 CORRECT_ALL 옵션이 필요 인수 - 명령의 보정에 대한 올바른 단지 충분한입니다을?
mpy

하하, 방금 거대한 답변을 썼지 만 나는 당신을 더 좋아합니다. 이 +1와 동의.
Mike HR

1
+1이지만 사소한 떨림 : nocorrect내장 된 것이 아니라 "예약 된 단어" type nocorrect입니다.
terdon

감사합니다, 당신은 절대적으로 맞습니다. 용어를 수정했습니다.
mpy

@ terdon : Btw, IMHO 당신은 예약 된 단어가 아니라 함수로 내장 된 쉘을 오버로드 할 수 있습니다.
mpy

6

좋아, 나는 이것을 잠시 동안 파고 들었고 zsh 메일 링리스트에서 몇 가지를 발견했다. 하나의 "은 총알"솔루션이 아닌 다른 작업을 수행하는 다양한 솔루션이 있습니다. 나는 내가 한 일 (약간의 경찰)을 게시 할뿐만 아니라 다른 접근법과 그 문제를 탐구 할 것입니다. 나는 개인적으로 갈 것입니다 :

  ~  alias sudo='sudo '
  ~  alias nsudo='nocorrect sudo'

편집하다:

나는 지금 갈거야

sudo \mv foo bar

대체 답변에서 @mpy에 의해 설명 된대로 이것이 필요한 경우.

/편집하다

별명을 사용할 수 있기 때문에 별명이 잘못되어 별명을 표시 할 때 nsudo실수로 내 파일 을 방해 하지 않도록 사용할 수 있습니다 .

더 나은 접근 방법은 zsh 메일 링리스트에서 제공됩니다. 내가 찾은 두 개의 스레드가있는 것으로 보입니다. 1999 년 한 이곳은 (즉, 질문, 후속 업을 참조, 특히의 이 한 해결 noglob그것뿐만 아니라 nocorrect 해결 (nocorrect을 의미 noglob 않는 경우, 그렇지 않으면 내가)는, 언급하시기 바랍니다 않는 생각하지 않는다? 문제. 내가 확실하지 오전

alias sudo='my_sudo '

function my_sudo {
    while [[ $# > 0 ]]; do
        case "$1" in
        command) shift ; break ;;
        nocorrect|noglob) shift ;;
        *) break ;;
        esac
    done
    if [[ $# = 0 ]]; then
        command sudo zsh
    else
        noglob command sudo $@
    fi
}

내 질문에서 요구 사항을 모두 충족시키는 것은 무엇입니까?

  ~  alias cat='echo hello'     
  ~  echo goodbye > example.txt
  ~  sudo cat
hello
  ~  sudo mv example.txt2 example.txt

또한 2008 년 메일 링리스트에서 다음과 같은 해결책으로 다시 등장한 것 같습니다 .

alias sudo='noglob do_sudo '
function do_sudo
{
    integer glob=1
    local -a run
    run=( command sudo )
    if [[ $# -gt 1 && $1 = -u ]]; then
        run+=($1 $2)
        shift ; shift
    fi
    (($# == 0)) && 1=/bin/zsh
    while (($#)); do
        case "$1" in
        command|exec|-) shift; break ;;
        nocorrect) shift ;;
        noglob) glob=0; shift ;;
        *) break ;;
        esac
    done
    if ((glob)); then
        PATH="/sbin:/usr/sbin:/usr/local/sbin:$PATH" $run $~==*
    else
        PATH="/sbin:/usr/sbin:/usr/local/sbin:$PATH" $run $==*
    fi
}

내가 완전히 이해하지 못하는 것을 많이하고있는 것 같습니다. 이것은 작성자가 명시한대로 자동 수정을 무시하는 것 같습니다.


1
그렇습니다. zsh 메일 링리스트는 고품질 솔루션의 거대한 소스입니다. 이러한 정교한 답변을 작성해 주셔서 감사합니다. +1 :)
mpy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.