Multiple commands in an alias for bash

2019-01-09 23:30发布

问题:

I'd like to define an alias that runs the following two commands consecutively.

gnome-screensaver
gnome-screensaver-command --lock

Right now I've added

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

to my .bashrc but since I lock my workstation so often it would be easier to just type one command.

回答1:

Try:

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

or

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

in your .bashrc

The second solution allows you to use arguments.



回答2:

The other answers answer the question adequately, but your example looks like the second command depends on the first one being exiting successfully. You may want to try a short-circuit evaluation in your alias:

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

Now the second command will not even be attempted unless the first one is successful. A better description of short-circuit evaluation is described in this SO question.



回答3:

Aliases are meant for aliasing command names. Anything beyond that should be done with functions.

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

Aliases are names that are still associated with the original name. ll is just a slightly specific kind of ls.

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

A function is a new command that has internal logic. It isn't simply a rename of another command. It does internal operations.

Technically, aliases in the Bash shell language are so limited in capabilities that they are extremely ill suited for anything that involves more than a single command. Use them for making a small mutation of a single command, nothing more.

Since the intention is to create a new command that performs an operation which internally will resolve in other commands, the only correct answer is to use a function here:

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

Usage of aliases in a scenario like this runs into a lot of issues. Contrary to functions, which are executed as commands, aliases are expanded into the current command, which will lead to very unexpected issues when combining this alias "command" with other commands. They also don't work in scripts.



回答4:

Does this not work?

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


回答5:

This would run the 2 commands one after another:

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


回答6:

So use a semi-colon:

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

This doesn't work well if you want to supply arguments to the first command. Alternatively, create a trivial script in your $HOME/bin directory.



回答7:

I came into a problem when declaring aliases into ~/.bashrc. My terminal did not recognize the aliases I declared in ~/.bashrc. I learned from the article (attached on the bottom) that Mac OS X run login-shell by default hence it calls ~/.bash_profile instead of ~/.bashrc.

Should you come into the same problem in declaring your aliases, you can refer to the following link to solve the problem:

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