sudo를 사용하여 명령에 대한 별칭을 만드는 방법

sudo를 사용하여 명령에 대한 별칭을 만드는 방법

다음과 같이 두 개의 별칭을 추가하고 싶습니다. 하나는 sudo가 아닐 때 명령을 실행하고 다른 하나는 sudo일 때 명령을 실행합니다.

alias v = 'nvim'
alias 'sudo v' = 'sudo -E nvim '

나도 결심했어 alias sudo='sudo '.

답변1

에서 무엇을 해야 하는지 설명하고 있습니다 bash. zsh거기에서 무엇을 해야할지 잘 모르겠습니다 .

나는 당신의 문제가 등호의 왼쪽에 있다고 생각합니다. 고유하고 짧으며 기억하기 쉬운 별칭 이름을 사용하십시오(공백 없음). 또한 등호 주위에는 공백이 없어야 합니다.

그렇지 않으면 별칭에 포함시키는 것이 쉽습니다 sudo. 별칭 정의에 넣으면 됩니다. 내 별명을 사용하여 예를 보여줄 수 있습니다 ~/.bashrc.

alias uc='sudo umount /dev/sdc*'

(드라이브의 모든 파티션을 마운트 해제합니다 /dev/sdc.)


sv별칭으로 이름을 제안할 수도 있지만 해당 이름을 가진 표준 도구가 있으므로 sev'에스당신은 -두번째NV나, 더 잘할게.

답변2

당신이 가지고 있다면

alias sudo='sudo '
alias v='nvim'

그런 다음 별칭의 후행 공백으로 인해 쉘이 별칭 확장을 위해 다음 단어도 확인하게 되므로 실행이 sudo v whatever작동합니다 .sudo nvim whatever

하지만 이름에 공백이 있는 단일 별칭을 가질 수는 없습니다. Bash는 이를 허용하지 않고 zsh는 허용하지만 실제로 사용할 수 있는 방법은 없다고 생각합니다.

zsh% alias 'a b'='echo test'
zsh% 'a b'
zsh: command not found: a b

$ alias 'a b'='echo test'
bash: alias: `a b': invalid alias name

-E해당 옵션을 에 추가하는 경우 별칭(예: ) sudo에 포함하지 않으려면 제가 생각할 수 있는 가장 가까운 옵션은 다음과 같습니다.sudoalias sudo='sudo -E '

alias sudoe='sudo -E '
alias v='nvim'
# or
alias sudov='sudo -E nvim'

또는 설명에서 알 수 있듯이 sudoedit/를 사용하여 sudo -e파일을 편집합니다.

답변3

해당 특정 구문을 사용하려는 경우 실행에 대한 별칭은 어디에 있습니까 v(그러나 실행을 원하지 않는 경우)nvimsudo vsudo -E nvim-E모두sudo 사용법) 함수를 사용하여 sudo를 재정의해야 할 가능성이 높습니다.

실제로, 다른 처리를 수행하는 함수를 정의하는 것은 그리 까다롭지 않습니다 v. 무엇까다로운 점은 현재 alias sudo='sudo '. 어려운 부분은 이 동작을 잃지 않도록 sudo 함수를 정의하는 것입니다.

나는 다음을 제안합니다. 이 sudo함수를 통해 첫 번째 매개변수를 읽습니다. 그렇다면 v우리는 그렇게 할 것입니다 sudo -E nvim. 다른 별칭인 경우 해당 별칭의 값으로 확장됩니다. 별칭이 전혀 아닌 경우 일반 sudo 명령을 사용하면 됩니다.


# for regular use, keep this alias
alias v='nvim'

# replace sudo with this functiom
sudo() {
    # check if next argument is 'v'
    if [[ "$1" == "v" ]] ; then
        # remove 'v' from the argument list
        shift

        # call sudo -E nvim on remaining arguments
        command sudo -E nvim "$@"

        # exit the function with the return value of the
        # sudo nvim -E command
        return $?
    fi

    # now check if first argument is a different alias; if so,
    # $expansion will be the alias definition if one exists,
    # or else it will be the empty string
    local expansion="${BASH_ALIASES[$1]}"
    if [[ -n "$expansion" ]] ; then
        # remove the alias from the argument list
        shift

        #if the expansion has variables in it,
        #we need to expand those variables, not
        #just the $expansion variable itself,
        #so we use eval
        eval "command sudo $expansion \"\$@\""

        # exit the function with its return value
        return $?
    fi
    # if we got here, what follows sudo is a
    # normal command, so we execute sudo with the
    # rest of the arguments as is
    command sudo "$@"
}

아마도 더 쉬운 방법이 있을 것입니다. 하지만 제 생각에는 이것이 효과가 있을 것 같습니다.

물론 sudo에 대한 별칭 사용, sudoedit 사용 등과 같은 다른 간단한 대안이 있지만(일부는 다른 답변에 설명되어 있음) 구문은 원하는 것과 약간 다릅니다.

관련 정보