web-dev-qa-db-ja.com

bashのエイリアス内の複数のコマンド

次の2つのコマンドを連続して実行するエイリアスを定義したいと思います。

gnome-screensaver
gnome-screensaver-command --lock

今、私は追加しました

alias lock='gnome-screensaver-command --lock'

.bashrcにアクセスしますが、ワークステーションを頻繁にロックするため、1つのコマンドを入力する方が簡単です。

182
yuriel

試してください:

alias lock='gnome-screensaver; gnome-screensaver-command --lock'

または

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

あなたの.bashrc

2番目の解決策では、引数を使用できます。

346
mouviciel

他の答えは質問に適切に答えますが、例は、2番目のコマンドが最初のコマンドが正常に終了することに依存しているように見えます。エイリアスで 短絡評価 を試してみてください:

alias lock='gnome-screensaver && gnome-screensaver-command --lock'

これで、最初のコマンドが成功しない限り、2番目のコマンドは試行されません。短絡評価のより良い説明は、この SOの質問 で説明されています。

68
gpojd

エイリアスは、エイリアスコマンド名用です。それ以上のことは、関数で行う必要があります。

alias ll='ls -l' # The ll command is an alias for ls -l

エイリアスは、元の名前にまだ関連付けられている名前です。 llは、わずかに特定の種類のlsです。

d() {
    if exists colordiff; then
        colordiff -ur "$@"
    Elif exists diff; then
        diff -ur "$@"
    Elif exists comm; then
        comm -3 "$1" "$2"
    fi | less
}

関数は、内部ロジックを持つ新しいコマンドです。これは、単に別のコマンドの名前を変更するだけではありません。内部操作を行います。

技術的には、Bashシェル言語のエイリアスは機能が非常に制限されているため、単一のコマンド以上を含むものには非常に適していません。それらを使用して、単一のコマンドの小さな突然変異を作成します。

意図は、他のコマンドで内部的に解決する操作を実行する新しいコマンドを作成することなので、正しい答えはここで関数を使用することだけです:

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

このようなシナリオでエイリアスを使用すると、多くの問題が発生します。コマンドとして実行される関数とは異なり、エイリアスは現在のコマンドに展開されるため、このエイリアス「コマンド」を他のコマンドと組み合わせると、非常に予期しない問題が発生します。また、スクリプトでは機能しません。

15
lhunath

これは機能しませんか?

alias whatever='gnome-screensaver ; gnome-screensaver-command --lock'
11
Sean Bright

これにより、2つのコマンドが次々に実行されます。

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'
3
Adnan

したがって、セミコロンを使用します。

alias lock='gnome-screensaver; gnome-screen-saver-command --lock'

最初のコマンドに引数を指定する場合、これはうまく機能しません。または、$ HOME/binディレクトリに簡単なスクリプトを作成します。

1

2番目の@mouvicielアプローチ。次のコマンドを使用すると、単純なコマンドで非常にうまく機能します。

alias doSomething='command1; command2'

引数を必要とするコマンドには、関数を使用するだけです:

doSomething() {
    command1
    command2 --lock
}
0
wpmoradi