zshユーザーのためのソリューション

zshユーザーのためのソリューション

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

次の情報を確認しました。ここ

sudoを使用するときは、エイリアス拡張を使用してください。それ以外の場合、sudoはエイリアスを無視します。

alias sudo='sudo '

うまくいかない理由を説明しました。ここ

Bashはエイリアスコマンドの最初の単語だけをチェックし、それ以降の単語はチェックしません。つまり、sudo llのようなコマンドでは、bashは最初の単語(sudo)でのみエイリアスをチェックし、llは無視されます。エイリアス値の末尾にスペースを追加して、bashにエイリアス(sudoなど)の後の次の単語を確認するように指示できます。

答え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行にすべて含まれており、追加のシェルやエイリアスのオーバーライドはありません。 ;-)

関連情報