bashのエイリアスにある複数のコマンド


210

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

gnome-screensaver
gnome-screensaver-command --lock

今私は追加しました

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

私の.bashrcに追加しますが、ワークステーションをロックするので、コマンドを1つ入力するだけの方が簡単です。

回答:


390

試してください:

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

または

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

あなたの.bashrc

2番目のソリューションでは、引数を使用できます。


7
それは "function lock(){blah}"であるべきではありませんか?
emeraldjava 2010年

2
引数をどのように渡しますか?lock()括弧内に変数 'msg'をネストすると、エラーsyntax error near unexpected token msg'` ..
geotheory

8
関数が定義されると、コマンドのように動作します。引数はコマンドラインにあり、空白で区切られます。宣言部分では、引数は関数本体の$1$2...です。
mouviciel 2014年

1
パラメータ付きのエイリアス行を含めないことへの反対票。
フィリップレゴ

2
@PhilipRego-私はあなたから学び、あなたの答えを賛成してくれるとうれしいです。
mouviciel

79

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

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

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


5
驚いたことに、でこれを試してみましたがgit fetch && git pull origin master、に交換&&するまでは機能しませんでした;
hakunin 2014

3
おそらくgit fetchが0以外のものを返したためでしょうか?
RobAu 2015

助けた!Xubuntu 16.04.3での作業
FernandoLeón

パラメータ付きのエイリアス行を含めないことへの反対票。
フィリップレゴ

18

エイリアスは、コマンド名にエイリアスを付けるためのものです。それ以上のことは関数で行うべきです。

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
}

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


あなたがあなたの答えでどんな例でも提供できればそれは最もよいでしょう。更新を待っています。
Sajid Ali、

1
パラメータ付きのエイリアス行を含めないことへの反対票。
Philip Rego

2
@PhilipRegoエイリアスはパラメーターを取りません。リンゴがオレンジ色ではないという理由で投票しないでください。代わりにオレンジを食べてください。答えがよく説明されているように、ここでの正しいツールはエイリアスではなく機能です。
lhunath

私はこのようなパラメータを意味します。ネストした引用符を間違って使用していました。alias = "git commit -m 'init'; git push; git status"
Philip Rego

@PhilipRego本当にエイリアスではなく関数を使用する必要があります。 gps() { git commit -m 'init '; git push; git status; } 説明したように、エイリアスは非常に限定され、壊れやすく、それらの唯一の目的はコマンドの名前を変更することです。無関係な目的でそれらを乱用すると、あなたが経験したばかりのようなお湯に落ちることになります。
lhunath


4

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

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

1

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

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

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


0

私の2セントを11歳のディスカッションに追加してみてください:

alias lock="gnome-screensaver \gnome-screensaver-command --lock"


0

この関数をに追加し~/.bashrcて端末を再起動するか、実行しますsource ~/.bashrc

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

このように、これらの2つのコマンドはlock、端末に入力するたびに実行されます。

あなたの特定のケースではを作成するaliasことはうまくいくかもしれませんが、私はそれをお勧めしません。直感的には、エイリアスの値は、ターミナルに値を入力した場合と同じように実行されると思います。ただし、そうではありません。

エイリアスの定義と使用に関するルールはやや混乱します。

そして

ほとんどすべての目的で、エイリアスよりもシェル関数が優先されます。

したがって、必要がない限り、エイリアスを使用しないでください。 https://ss64.com/bash/alias.html


-3

にエイリアスを宣言するときに問題が発生しました~/.bashrc。端末で、で宣言したエイリアスが認識されませんでした~/.bashrc。Mac OS Xはlogin-shellデフォルトで実行されるため、~/.bash_profileではなくが呼び出されることを記事(下部に添付)から学びました~/.bashrc

エイリアスの宣言で同じ問題が発生した場合は、次のリンクを参照して問題を解決できます。

http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html


このQAは、エイリアスを配置する場所ではなく、エイリアス内の複数のコマンドに関するものです。
facuq

source .bashrcログアウトせずにエイリアスが認識されるように、ファイルへの変更を保存した後は常に実行します。
スコットフレミング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.