upstart
デーモン管理のためにUbuntu 10.04を実行しています。私のエンタープライズアプリケーションはデーモンとして実行され、さまざまな権限のためにrootとして実行する必要があります。たとえば、
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
1行にすべて含まれており、追加のシェルやエイリアスのオーバーライドはありません。 ;-)