sudoを使用してコマンドのエイリアスを作成する方法

sudoを使用してコマンドのエイリアスを作成する方法

次のように2つのエイリアスを追加したいと思います。 1つはsudoではない場合はコマンドを実行し、もう1つはsudoの場合はコマンドを実行します。

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

私も決心したalias sudo='sudo '

答え1

で何をすべきかを説明していますbashzshそこで何をすべきかわかりません。

私はあなたの問題が等号の左側にあると思います。一意で短く覚えやすいエイリアス名を使用してください(スペースなし)。また、等号の周囲には空白があってはなりません。

それ以外の場合は、エイリアスに含めるのは簡単ですsudo。エイリアス定義に入れるだけです。別名を使用して例を表示できます~/.bashrc

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

(ドライブのすべてのパーティションをマウント解除します/dev/sdc。)


svエイリアスとして名前を提案することもできますが、その名前の標準ツールがあるのでsevSあなたは -第二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の使用などの他の単純な代替方法があります(一部は他の回答で説明されています)、構文は必要なものとは少し異なります。

関連情報