In Bash, when to alias, when to script, and when to write a function?Aliases vs functions vs scriptsHow to...
How do I automate adjusting a line to a point or a series of points in ArcGIS Suite?
What term would be used for words that are borrowed from Japanese and used in other languages?
What is the meaning of "log" in "hours logged"?
70's/80's story about a high ranking prisoner of war on a prison planet
An employee has low self-confidence, and is performing poorly. How can I help?
How effective are nunchaku as a choking weapon?
How are steel imports supposed to threaten US national security?
D&D Monsters and Copyright
What causes standard door hinges to close up to a certain amount automatically?
Why is the intercept changing in a logistic regression when all predictors are standardized?
Why CMYK & PNG is not possible?
How can I replicate this effect of the Infinity Gauntlet using official material?
Why didn't Kes send Voyager home?
Why did the range based for loop specification change in C++17
Why did a young George Washington sign a document admitting to assassinating a French military officer?
Installing Proprietary Windows Drivers on Linux
Parliament Cannot Bind Future Parliaments
Did Feynman cite a fallacy about only circles having the same width in all directions as a reason for the Challenger disaster?
How can I curtail abuse of the Illusion wizard's Illusory Reality feature?
Solve Euler Project #9 only mathematically - Pythagorean triplet
What does IKEA-like mean?
Compare items between two instances
"a sign that one should be computing K-theory"
Can a successful economy exist without renting stuff?
In Bash, when to alias, when to script, and when to write a function?
Aliases vs functions vs scriptsHow to create an alias for a sequence of commands?alias for killing all processes of a grep hitAlias in .bashrc doesn't seem to accept an argumentcd in bash script without alias, function, sourceUsing xfreerdp with variable IP/hostnamehow to make a bash alias to a script in folderAliasing a command with special parametersA substitue for Bash aliases (something that behaves basically like an alias but isn't an alias)create unix alias for “ssh username@”, and I would like to use it for any ipaddress.cp -f cannot overwrite cp -i aliasHow can I get this script file's functions to load without having to source it every time? “command not found” (Bash/scripting basics)calling Bash Function from alias definitionStart bash with a specific alias setBash (Git) - Functions, Alias, and SH script filesCan I concatenate a bash alias?how to get or reflect the name of the bash function which is called?Syntax Error near Unexpected Token in a bash function definitionAlias and functionsWhich of the following shell operations are performed inside the function body when running a function definition and when calling a function?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{
margin-bottom:0;
}
It's taken me almost 10 years of Linux usage to ask this question. It was all trial and error and random late-night internet surfing.
But people shouldn't need 10 years for this. If I were just starting out with Linux, I'd want to know: When to alias, when to script, and when to write a function?
Where aliases are concerned, I use aliases for very simple operations that don't take arguments.
alias houston='cd /home/username/.scripts/'
That seems obvious. But some people do this:
alias command="bash bashscriptname"
(and add it to the .bashrc
file)
Is there a good reason to do that? I'm trying really hard, but I genuinely can't think of any circumstances in which I'd want to do that. So, if there is an edge case where that would make a difference, please answer below.
Because that's where I would just put something in my PATH and chmod +x
it, which is another thing that came after years of Linux trial-and-error.
Which brings me to the next topic. For instance, I added a hidden folder (.scripts/
) in the home directory to my PATH by just adding a line to my .bashrc
(PATH=$PATH:/home/username/.scripts/
), so anything executable in there automagically autocompletes.
If I needed to.
I don't really need that, though, do I? I would only use that for languages that are not the shell, like Python.
If it's the shell, I can just write a function inside the very same .bashrc
:
funcname () {
somecommand -someARGS "$@"
}
As I stated, I found a lot of this out through trial and error. And I only truly saw the beauty of functions when my computer died and I was forced to use the computers of the people around me when they weren't using them.
Instead of moving a whole directory of scripts from computer to computer, I ended up just replacing everyone else's .bashrc with my own, since they had never even made a single modification.
But did I miss anything?
So, what would you tell a beginning Linux user about when to alias, when to script, and when to write a function?
If it's not obvious, I'm assuming the people who answer this will make use of all three options. If you only use aliases, or only use scripts, or only use functions—or if you only use aliases and scripts or aliases and functions or scripts and functions—this question isn't really aimed at you.
bash shell-script alias function
add a comment
|
It's taken me almost 10 years of Linux usage to ask this question. It was all trial and error and random late-night internet surfing.
But people shouldn't need 10 years for this. If I were just starting out with Linux, I'd want to know: When to alias, when to script, and when to write a function?
Where aliases are concerned, I use aliases for very simple operations that don't take arguments.
alias houston='cd /home/username/.scripts/'
That seems obvious. But some people do this:
alias command="bash bashscriptname"
(and add it to the .bashrc
file)
Is there a good reason to do that? I'm trying really hard, but I genuinely can't think of any circumstances in which I'd want to do that. So, if there is an edge case where that would make a difference, please answer below.
Because that's where I would just put something in my PATH and chmod +x
it, which is another thing that came after years of Linux trial-and-error.
Which brings me to the next topic. For instance, I added a hidden folder (.scripts/
) in the home directory to my PATH by just adding a line to my .bashrc
(PATH=$PATH:/home/username/.scripts/
), so anything executable in there automagically autocompletes.
If I needed to.
I don't really need that, though, do I? I would only use that for languages that are not the shell, like Python.
If it's the shell, I can just write a function inside the very same .bashrc
:
funcname () {
somecommand -someARGS "$@"
}
As I stated, I found a lot of this out through trial and error. And I only truly saw the beauty of functions when my computer died and I was forced to use the computers of the people around me when they weren't using them.
Instead of moving a whole directory of scripts from computer to computer, I ended up just replacing everyone else's .bashrc with my own, since they had never even made a single modification.
But did I miss anything?
So, what would you tell a beginning Linux user about when to alias, when to script, and when to write a function?
If it's not obvious, I'm assuming the people who answer this will make use of all three options. If you only use aliases, or only use scripts, or only use functions—or if you only use aliases and scripts or aliases and functions or scripts and functions—this question isn't really aimed at you.
bash shell-script alias function
5
possible duplicate of bash functions vs scripts
– Gilles
Feb 5 '12 at 22:35
10
+1 for the stating explicitly all the subsets of {alias, script, function} at which this question does not aim. +1 for the childlike faith that it was OK for you to omit the null subset.
– Thomas L Holaday
Aug 26 '13 at 15:16
1
Although the question specifically asked about bash, note that older Bourne shells had 'alias' but not functions. This might make a difference if you're worried about compatibility.
– AndyB
Mar 4 '16 at 5:53
If .bashrc really the best place, or at least a solid place, for this? There are so many ways to do the same thing in Linux, which I appreciate, however, all things being equal, I prefer to do things the most common way.
– Kit10
Jun 10 '16 at 13:33
add a comment
|
It's taken me almost 10 years of Linux usage to ask this question. It was all trial and error and random late-night internet surfing.
But people shouldn't need 10 years for this. If I were just starting out with Linux, I'd want to know: When to alias, when to script, and when to write a function?
Where aliases are concerned, I use aliases for very simple operations that don't take arguments.
alias houston='cd /home/username/.scripts/'
That seems obvious. But some people do this:
alias command="bash bashscriptname"
(and add it to the .bashrc
file)
Is there a good reason to do that? I'm trying really hard, but I genuinely can't think of any circumstances in which I'd want to do that. So, if there is an edge case where that would make a difference, please answer below.
Because that's where I would just put something in my PATH and chmod +x
it, which is another thing that came after years of Linux trial-and-error.
Which brings me to the next topic. For instance, I added a hidden folder (.scripts/
) in the home directory to my PATH by just adding a line to my .bashrc
(PATH=$PATH:/home/username/.scripts/
), so anything executable in there automagically autocompletes.
If I needed to.
I don't really need that, though, do I? I would only use that for languages that are not the shell, like Python.
If it's the shell, I can just write a function inside the very same .bashrc
:
funcname () {
somecommand -someARGS "$@"
}
As I stated, I found a lot of this out through trial and error. And I only truly saw the beauty of functions when my computer died and I was forced to use the computers of the people around me when they weren't using them.
Instead of moving a whole directory of scripts from computer to computer, I ended up just replacing everyone else's .bashrc with my own, since they had never even made a single modification.
But did I miss anything?
So, what would you tell a beginning Linux user about when to alias, when to script, and when to write a function?
If it's not obvious, I'm assuming the people who answer this will make use of all three options. If you only use aliases, or only use scripts, or only use functions—or if you only use aliases and scripts or aliases and functions or scripts and functions—this question isn't really aimed at you.
bash shell-script alias function
It's taken me almost 10 years of Linux usage to ask this question. It was all trial and error and random late-night internet surfing.
But people shouldn't need 10 years for this. If I were just starting out with Linux, I'd want to know: When to alias, when to script, and when to write a function?
Where aliases are concerned, I use aliases for very simple operations that don't take arguments.
alias houston='cd /home/username/.scripts/'
That seems obvious. But some people do this:
alias command="bash bashscriptname"
(and add it to the .bashrc
file)
Is there a good reason to do that? I'm trying really hard, but I genuinely can't think of any circumstances in which I'd want to do that. So, if there is an edge case where that would make a difference, please answer below.
Because that's where I would just put something in my PATH and chmod +x
it, which is another thing that came after years of Linux trial-and-error.
Which brings me to the next topic. For instance, I added a hidden folder (.scripts/
) in the home directory to my PATH by just adding a line to my .bashrc
(PATH=$PATH:/home/username/.scripts/
), so anything executable in there automagically autocompletes.
If I needed to.
I don't really need that, though, do I? I would only use that for languages that are not the shell, like Python.
If it's the shell, I can just write a function inside the very same .bashrc
:
funcname () {
somecommand -someARGS "$@"
}
As I stated, I found a lot of this out through trial and error. And I only truly saw the beauty of functions when my computer died and I was forced to use the computers of the people around me when they weren't using them.
Instead of moving a whole directory of scripts from computer to computer, I ended up just replacing everyone else's .bashrc with my own, since they had never even made a single modification.
But did I miss anything?
So, what would you tell a beginning Linux user about when to alias, when to script, and when to write a function?
If it's not obvious, I'm assuming the people who answer this will make use of all three options. If you only use aliases, or only use scripts, or only use functions—or if you only use aliases and scripts or aliases and functions or scripts and functions—this question isn't really aimed at you.
bash shell-script alias function
bash shell-script alias function
edited Apr 25 '16 at 20:01


Wildcard
24.7k11 gold badges73 silver badges186 bronze badges
24.7k11 gold badges73 silver badges186 bronze badges
asked Feb 5 '12 at 13:12
ixtmixilixixtmixilix
5,81720 gold badges62 silver badges103 bronze badges
5,81720 gold badges62 silver badges103 bronze badges
5
possible duplicate of bash functions vs scripts
– Gilles
Feb 5 '12 at 22:35
10
+1 for the stating explicitly all the subsets of {alias, script, function} at which this question does not aim. +1 for the childlike faith that it was OK for you to omit the null subset.
– Thomas L Holaday
Aug 26 '13 at 15:16
1
Although the question specifically asked about bash, note that older Bourne shells had 'alias' but not functions. This might make a difference if you're worried about compatibility.
– AndyB
Mar 4 '16 at 5:53
If .bashrc really the best place, or at least a solid place, for this? There are so many ways to do the same thing in Linux, which I appreciate, however, all things being equal, I prefer to do things the most common way.
– Kit10
Jun 10 '16 at 13:33
add a comment
|
5
possible duplicate of bash functions vs scripts
– Gilles
Feb 5 '12 at 22:35
10
+1 for the stating explicitly all the subsets of {alias, script, function} at which this question does not aim. +1 for the childlike faith that it was OK for you to omit the null subset.
– Thomas L Holaday
Aug 26 '13 at 15:16
1
Although the question specifically asked about bash, note that older Bourne shells had 'alias' but not functions. This might make a difference if you're worried about compatibility.
– AndyB
Mar 4 '16 at 5:53
If .bashrc really the best place, or at least a solid place, for this? There are so many ways to do the same thing in Linux, which I appreciate, however, all things being equal, I prefer to do things the most common way.
– Kit10
Jun 10 '16 at 13:33
5
5
possible duplicate of bash functions vs scripts
– Gilles
Feb 5 '12 at 22:35
possible duplicate of bash functions vs scripts
– Gilles
Feb 5 '12 at 22:35
10
10
+1 for the stating explicitly all the subsets of {alias, script, function} at which this question does not aim. +1 for the childlike faith that it was OK for you to omit the null subset.
– Thomas L Holaday
Aug 26 '13 at 15:16
+1 for the stating explicitly all the subsets of {alias, script, function} at which this question does not aim. +1 for the childlike faith that it was OK for you to omit the null subset.
– Thomas L Holaday
Aug 26 '13 at 15:16
1
1
Although the question specifically asked about bash, note that older Bourne shells had 'alias' but not functions. This might make a difference if you're worried about compatibility.
– AndyB
Mar 4 '16 at 5:53
Although the question specifically asked about bash, note that older Bourne shells had 'alias' but not functions. This might make a difference if you're worried about compatibility.
– AndyB
Mar 4 '16 at 5:53
If .bashrc really the best place, or at least a solid place, for this? There are so many ways to do the same thing in Linux, which I appreciate, however, all things being equal, I prefer to do things the most common way.
– Kit10
Jun 10 '16 at 13:33
If .bashrc really the best place, or at least a solid place, for this? There are so many ways to do the same thing in Linux, which I appreciate, however, all things being equal, I prefer to do things the most common way.
– Kit10
Jun 10 '16 at 13:33
add a comment
|
14 Answers
14
active
oldest
votes
An alias should effectively not (in general) do more than change the default options of a command. It is nothing more than simple text replacement on the command name. It can't do anything with arguments but pass them to the command it actually runs. So if you simply need to add an argument at the front of a single command, an alias will work. Common examples are
# Make ls output in color by default.
alias ls="ls --color=auto"
# make mv ask before overwriting a file by default
alias mv="mv -i"
A function should be used when you need to do something more complex than an alias but that wouldn't be of use on its own. For example, take this answer on a question I asked about changing grep
's default behavior depending on whether it's in a pipeline:
grep() {
if [[ -t 1 ]]; then
command grep -n "$@"
else
command grep "$@"
fi
}
It's a perfect example of a function because it is too complex for an alias (requiring different defaults based on a condition), but it's not something you'll need in a non-interactive script.
If you get too many functions or functions too big, put them into separate files in a hidden directory, and source them in your ~/.bashrc
:
if [ -d ~/.bash_functions ]; then
for file in ~/.bash_functions/*; do
. "$file"
done
fi
A script should stand on its own. It should have value as something that can be re-used, or used for more than one purpose.
12
It's also important to remember that – unless sourced with.
orsource
– a script is executed by separate bash process and has its own environment. For this reason, anything that modifies the shell environment (e.g. functions, variables, etc.) will not persist in the shell environment from which you run the script.
– Will Vousden
Mar 5 '15 at 11:02
add a comment
|
The other answers provide some soft general guidelines based on personal taste, but ignore many pertinent facts that one should consider when deciding between scripts, functions, or aliases.
Aliases and Functions ¹
- The entire contents of aliases and functions are stored in the shell's memory.
- A natural consequence of this is aliases and functions can only be used by the current shell, and not by any other programs you may invoke from the shell like text editors, scripts, or even child instances of the same shell.
- Aliases and functions are executed by the current shell, i.e. they run within and affect the shell's current environment.² No separate process is necessary to run an alias or function.
Scripts
- Shells do not keep scripts in memory. Instead, scripts are read from the files where they are stored every time they are needed. If the script is found via a
$PATH
search, many shells store a hash of its path name in memory to save time on future$PATH
look-ups, but that is the extent of a script's memory footprint when not in use.
Scripts can be invoked in more ways than functions and aliases can. They can be passed as an argument to an interpreter, like
sh script
, or invoked directly as an executable, in which case the interpreter in the shebang line (e.g.#!/bin/sh
) is invoked to run it. In both cases, the script is run by a separate interpreter process with its own environment separate from that of your shell, whose environment the script cannot affect in any way. Indeed, the interpreter shell does not even have to match the invoking shell. Because scripts invoked this way appear to behave like any ordinary executable, they can be used by any program.
Finally, a script can be read and run by the current shell with
.
, or in some shells,source
. In this case, the script behaves much like a function that is read on-demand instead of being constantly kept in memory.
Application
Given the above, we can come up with some general guidelines for whether to make something a script or function / alias.
Do other programs besides your shell need to be able to use it? If so, it has to be a script.
Do you only want it to be available from an interactive shell? It's common to want to change the default behavior of many commands when run interactively without affecting external commands / scripts. For this case, use an alias / function set in the shell's "interactive-mode-only" rc file (for
bash
this is.bashrc
).Does it need to change the shell's environment? Both a function / alias or a sourced script are possible choices.
Is it something you use frequently? It's probably more efficient to keep it in memory, so make it a function / alias if possible.
Conversely, is it something you use only rarely? In that case, there's no sense having it hog memory when you don't need it, so make it a script.
¹ While functions and aliases have some important differences, they are grouped together because functions can do everything aliases can. Aliases can not have local variables nor can they process arguments, and they are inconvenient for anything longer than one line.
² Every running process in a Unix system has an environment consisting of a bunch of variable=value
pairs which often contain global configuration settings, like LANG
for the default locale and PATH
for specifying executable search path.
26
IMHO This is the best answer.
– Luc M
Feb 8 '12 at 18:51
4
The question/answer format is a great idea. I might steal that. ;-)
– Mikel
May 9 '12 at 15:46
4
Worth noting: if two (or more) scripts need to share some code, it's probably best to put that code into a function which is itself located in a third file that both of those scripts import/source.
– kbolino
Sep 21 '16 at 19:40
3
Another item to add to that list of questions: Do you ever need to change functionality in the command on the fly? changes to a script will be reflected in all sessions, whereas functions and aliases must be reloaded or redefined on a per session basis.
– Stratus3D
Apr 14 '17 at 21:02
3
Good answer. One more important thing (for me): when creating a "shortcut" to other utils, it's better to use an alias because existing autocomplete will just work with aliases, but not with scripts or functions (so +1 for aliases). e.g. By creating analias g='gradle'
I get gradle autocompletion when using myg
alias, but won't get it out-of-the-box when using a script withgradle $*
or a function withgradle $@
– Yoav Aharoni
Feb 4 '18 at 14:29
|
show 8 more comments
I think it's up to each person's taste. For me the logic goes like this:
- First I try to make an alias, because it's the simplest.
- If the thing is too complicated to fit in one line, I try to make it a function.
- When the function starts to grow beyond a dozen of lines I put it in a script.
There is really nothing to restrict you from doing something that works.
6
I often skip the function option, and make a script right away. But I agree that it is partly a matter of taste
– Bernhard
Feb 5 '12 at 15:00
2
A function begins to make sense if you need it in several scripts.
– Nils
Feb 10 '12 at 21:45
7
... or if you need the side-effects to alter the current shell.
– glenn jackman
Jul 27 '15 at 16:30
makes sense, man!
– explorer
May 13 at 4:18
add a comment
|
At least partially it's a matter of personal taste. On the other hand there are some clear functional distinctions:
- aliases: only suitable for simple text replacements, no arguments/parameters
- functions: easy to write/use, full shell scripting capability, only available inside bash
- scripts: more or less like functions, but available (callable) outside of bash as well
Looking at shell scripting I've done the last few years I have more or less stopped writing aliases (because they all tend to grow into functions over time) and do scripts only if they need to be available also from non-bash environments.
PS: As for alias command="bash bashscriptname"
I don't actually see any reason to do this. Even if bashscriptname
is not in $PATH, a simple alias c=/path/to/script
would be enough.
1
Inalias command="bash bashscriptname"
the script does not necessarily have to be executable; in thealias c=/path/to/script
it has to.
– Martin - マーチン
Jul 24 '18 at 16:29
It is not true at all that functions are "only available inside Bash". If you mean to say they are a Bash-only feature, that is simply false (Bourne shell and every compatible derivative has them); and if you mean to say they are a feature of interactive shells, that's not accurate either (though aliases, variables, and functions defined in a file which gets loaded at startup by interactive shells obviously will not be loaded by noninteractive shells).
– tripleee
Aug 19 '18 at 8:10
@tripleee The meaning was more like "you can'texec()
shell functions" :-)
– nohillside
Sep 17 '18 at 8:50
add a comment
|
Here are some additional points about aliases and functions:
Same-named alias and function can co-exist- alias namespace is looked up first (see first example)
- aliases cannot be (un)set in subshells or non-interactive environment (see second example)
For example:
alias f='echo Alias'; f # prints "Alias"
function f { echo 'Function'; }; f # prints "Alias"
unalias f; f # prints "Function"
As we can see, there are separate namespaces for aliases and functions; more details can be found using declare -A -p BASH_ALIASES
and declare -f f
, which prints their definitions (both are stored in memory).
Example showing limitations of aliases:
alias a='echo Alias'
a # OK: prints "Alias"
eval a; # OK: prints "Alias"
( alias a="Nested"; a ); # prints "Alias" (not "Nested")
( unalias a; a ); # prints "Alias"
bash -c "alias aa='Another Alias'; aa" # ERROR: bash: aa: command not found
As we can see aliases are not nestable, unlike functions. Also, their usage is limited to the interactive sessions.
Finally, note that you can have arbitrary computation in an alias by declaring a function a immediately calling it, like so:
alias a_complex_thing='f() { do_stuff_in_function; } f'
which is already in widespread use in case of Git aliases. The benefit of doing so over declaring a function is that your alias cannot be simply overwritten by source-ing (or using .
) a script which happens to declare a same-named function.
add a comment
|
When to write a script ...
- Scripts assemble software components (aka. tools, commands, processes, executables, programs) into more complex components, which may themselves be assembled into still more complex components.
- Scripts are usually made executable so they can be called by name. When called, a new subprocess is spawned for the script to run in. Copies of any
export
ed variables and/or functions are passed by value to the script. Changes to those variables do not propagate back to the parent script. - Scripts may also be loaded(sourced) as if they were part of the calling script. This is analogous to what some other languages call "import" or "include". When sourced, they execute within the existing process. No subprocess is spawned.
When to write a function ...
- Functions are effectively pre-loaded shell scripts. They perform a bit better than calling a separate script, but only if it must be read from mechanical disk. Today's proliferation of flashdrives, SSDs and Linux's normal caching in unused RAM make that improvement largely unmeasurable.
- Functions serve as bash's principle means of achieving modularity, encapsulation and reuse. They improve the clarity, reliability and maintainability of scripts.
- The syntax rules for calling a function are identical to that of calling an executable. A function with the same name as an executable would be invoked instead of the executable.
- Functions are local to the script they are in.
- Functions may be exported (copied by value) so they can be used inside called scripts. Thus, functions only propagate to child processes, never parents.
- Functions create reusable commands that are often assembled into libraries (a script with only function definitions) to be sourced by other scripts.
When to write an alias ...
- Bash aliases don't work inside shell script constructs like if/then and for/do loops, so should only be used as keyboard shortcuts on an interactive commandline. Thus, all alias definitions usually reside inside the appropriate login script like
~/.profile
or~/.bashrc
.
Within scripts like library scripts, sometimes an alias for a function is needed, such as when a function is renamed but backward compatibility is required. This can be accomplished by creating a simple function with the old name that passes all its arguments to the
new function...
# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }
add a comment
|
One other thing that I don't believe has been brought up: a function executes in the context of the invoking process, whereas a script forks a new shell.
This could be important for performance -- a function is faster, since it doesn't fork()
and exec()
. In normal circumstances, the difference is trivial, but if you are debugging a system that is out of memory and is page-thrashing, it could make a big difference.
Also, if you want to modify your current shell environment, you should use a function. For example, a function could change the command lookup $PATH
for the current shell, but a script cannot, because it operates on a fork/exec copy of $PATH
.
How does this propagation of functions to children work?
– HappyFace
Dec 16 '18 at 21:27
1
@HappyFace In Bash you canexport -f
a function, though the precise inner workings of this are somewhat obscure. This is not portable to traditional Bourne shell I believe.
– tripleee
Aug 5 at 16:53
add a comment
|
Script and alias and script and function aren't mutually exclusive. You can and do store aliases and functions in scripts.
Scripts are just code which is made persistent. Useful functions and aliases which you like to use in the future are stored in scripts. However, a script is often a collection of more than one function.
Since aliases aren't parameterized, they are very limited; usually to define some default parameters.
A function is a separate unit of code, a well-defined concept of a few lines of code which can't separated into smaller, useful parts; one which can be reused directly or other by other functions.
add a comment
|
If it should be very fast, make it an alias or a function.
If it should be usable outside your preferred shell, make it a script.1
If it takes arguments, make it a function or a script.
If it needs to contain special characters, make it an alias or a script.2
If it needs to work with sudo, make it an alias or a script.3
If you want to change it easily without logging out and in, a script is easier.4
Footnotes
1 Or make it an alias, put it in ~/.env
and set export ENV="$HOME/.env"
, but it's complicated to make it work portably.
2 Function names must be identifiers, so they must start with a letter, and may only contain letters, digits, and underscores. For example, I have an alias alias +='pushd +1'
. It can't be a function.
3 And add the alias alias sudo='sudo '
. Ditto any other command such as strace
, gdb
, etc. that takes a command as its first argument.
4 See also: fpath. Of course you can also do source ~/.bashrc
or similar, but this often has other side effects.
1
I didn't know you could alias+
in bash. Interestingly, after testing I discovered that in bash you can make+
an alias but not a function, as you say, but zsh is the reverse -+
can be a function but not an alias.
– Kevin
May 9 '12 at 18:42
Inzsh
you have to writealias -- +='some command here'
.
– Mikel
May 10 '12 at 1:07
Somehow, I don't think aliasing+
is portable. See the POSIX spec on Alias Names
– jw013
Aug 23 '12 at 18:08
3
Upvote for coveringsudo
usage. Regarding footnote 4, I store my aliases in~/.bash_aliases
and function definitions in~/.bash_functions
so I can easily resource
them (without any danger of side effects).
– Anthony Geoghegan
Nov 19 '15 at 11:15
add a comment
|
Just to add a few notes:
- Only separate script can be used with sudo (like if you need to edit a system file), for example:
sudo v /etc/rc.conf #where v runs vim in a new terminal window;
- Only aliases or functions could replace system commands under same name (assuming that you add your scripts dir to the end of PATH, which I think is advisable for safety in case of accidental or malevolent creating of script with name identical to a system command), for example:
alias ls='ls --color=auto' #enable colored output;
- Aliases and functions take less memory and time for execution, but take time to load (since shell has to interpret them all before showing you prompt). Take this into account if you run new shell processes regularily, for example:
# pressing key to open new terminal
# waiting for a few seconds before shell prompt finally appears.
Other than that, you could use the simplest form possible, i.e. first consider alias, then function, then script.
5
Aliases can also be used withsudo
. But first you needalias sudo='sudo '
.
– Mikel
May 9 '12 at 15:32
While it is true that executing a script will momentarily consume more memory for the duration of the fork+exec, having a lot of code loaded into the memory of the current shell instance makes it consume more memory going forward, often to store code which only gets used fairly rarely.
– tripleee
Aug 19 '18 at 8:17
add a comment
|
My rule of thumb is:
- aliases - one command, no parameters
- functions - one command some parameters
- script - several commands, no parameters
add a comment
|
In a multi user ( or multi sysamin ) environment, I use scripts for everything, even if it just ends up being a short 'exec something....' wrapper.
Sure, it's technically slower/less efficient than an alias or function, but that almost never matters - and provided it's in the path, a script always works.
Your feature might be called from cron, from something with a reduced or modified environment like sudo or env, or the user may just be using a different shell to you - all or which is likely to break an alias or function.
If you have something performance sensitive, handle that as a special case, or better yet, consider that a trigger to rewrite in a more functional scripting language.
If we're talking about features that will only be used in other scripts, then you can also consider defining a standard shell, and writing a function library script that can just be . sourced I to all other scripts.
T
add a comment
|
An Example for a Situation Where you Most Likely Would Like to use an Alias.
I know this is an old post but I would like to point out a situation where I almost had to use a combination of alias with a script and I chose not to use a function.
I have a script in ~/.bin/
called setup
that does the following:1
- brings me to a certain directory.
- defines a few variables.
- prints messages about the state of the directory.2
The point is that if I would just run setup <project-name>
I wouldn't have those variables defined and I wouldn't have gotten to the directory at all. The solution I found to be the best was to add this script to PATH
and add alias setup=". ~/.bin/setup"
to ~/.bashrc
or whatever.
Notes:
- I used a script for this task and not a function not because it's particularly long but because I can edit it and I don't have to source the file after an edit if I want to refresh it's usage.
- A similar case accoured to me when I created a script to reload all my dotfiles.3
The script is available in my dotfiles repository under.bin/
.
About the script: I give this script an argument which is a name for the project I defined in advanced. Afterwards the script knows to bring to me to the right directory according to a certaincsv
file. The variables it defines are taken from the makefile in that directory. The script runs afterwardsls -l
andgit status
to show me what's going on there.
- That script is also available in my dotfiles repository under
.bin/
as well.
1
Hm, seems that should just be a function, not an alias-script combination. (BTW, environments is spelled "environments" not "enviorments.")
– Wildcard
Apr 25 '16 at 19:57
Thanks for commenting about the typo, I shall fix it on the next commit. As for using a function instead of a script - perhaps I'll use a function for this particular task and drop these aliases. The point is that sometimes it's quite easy to use a script and an alias if you edit that script from time to time.
– Doron Behar
Apr 25 '16 at 22:46
add a comment
|
When to write a script
When you might want to run the command from a tool other than the shell.
This includes vim (for me): having written filters and other programs as scripts, I can do something like :%!my-filter
to filter a file through the program from my editor.
If my-filter
were a function or alias, that would not be possible.
add a comment
|
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/4.0/"u003ecc by-sa 4.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f30925%2fin-bash-when-to-alias-when-to-script-and-when-to-write-a-function%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
14 Answers
14
active
oldest
votes
14 Answers
14
active
oldest
votes
active
oldest
votes
active
oldest
votes
An alias should effectively not (in general) do more than change the default options of a command. It is nothing more than simple text replacement on the command name. It can't do anything with arguments but pass them to the command it actually runs. So if you simply need to add an argument at the front of a single command, an alias will work. Common examples are
# Make ls output in color by default.
alias ls="ls --color=auto"
# make mv ask before overwriting a file by default
alias mv="mv -i"
A function should be used when you need to do something more complex than an alias but that wouldn't be of use on its own. For example, take this answer on a question I asked about changing grep
's default behavior depending on whether it's in a pipeline:
grep() {
if [[ -t 1 ]]; then
command grep -n "$@"
else
command grep "$@"
fi
}
It's a perfect example of a function because it is too complex for an alias (requiring different defaults based on a condition), but it's not something you'll need in a non-interactive script.
If you get too many functions or functions too big, put them into separate files in a hidden directory, and source them in your ~/.bashrc
:
if [ -d ~/.bash_functions ]; then
for file in ~/.bash_functions/*; do
. "$file"
done
fi
A script should stand on its own. It should have value as something that can be re-used, or used for more than one purpose.
12
It's also important to remember that – unless sourced with.
orsource
– a script is executed by separate bash process and has its own environment. For this reason, anything that modifies the shell environment (e.g. functions, variables, etc.) will not persist in the shell environment from which you run the script.
– Will Vousden
Mar 5 '15 at 11:02
add a comment
|
An alias should effectively not (in general) do more than change the default options of a command. It is nothing more than simple text replacement on the command name. It can't do anything with arguments but pass them to the command it actually runs. So if you simply need to add an argument at the front of a single command, an alias will work. Common examples are
# Make ls output in color by default.
alias ls="ls --color=auto"
# make mv ask before overwriting a file by default
alias mv="mv -i"
A function should be used when you need to do something more complex than an alias but that wouldn't be of use on its own. For example, take this answer on a question I asked about changing grep
's default behavior depending on whether it's in a pipeline:
grep() {
if [[ -t 1 ]]; then
command grep -n "$@"
else
command grep "$@"
fi
}
It's a perfect example of a function because it is too complex for an alias (requiring different defaults based on a condition), but it's not something you'll need in a non-interactive script.
If you get too many functions or functions too big, put them into separate files in a hidden directory, and source them in your ~/.bashrc
:
if [ -d ~/.bash_functions ]; then
for file in ~/.bash_functions/*; do
. "$file"
done
fi
A script should stand on its own. It should have value as something that can be re-used, or used for more than one purpose.
12
It's also important to remember that – unless sourced with.
orsource
– a script is executed by separate bash process and has its own environment. For this reason, anything that modifies the shell environment (e.g. functions, variables, etc.) will not persist in the shell environment from which you run the script.
– Will Vousden
Mar 5 '15 at 11:02
add a comment
|
An alias should effectively not (in general) do more than change the default options of a command. It is nothing more than simple text replacement on the command name. It can't do anything with arguments but pass them to the command it actually runs. So if you simply need to add an argument at the front of a single command, an alias will work. Common examples are
# Make ls output in color by default.
alias ls="ls --color=auto"
# make mv ask before overwriting a file by default
alias mv="mv -i"
A function should be used when you need to do something more complex than an alias but that wouldn't be of use on its own. For example, take this answer on a question I asked about changing grep
's default behavior depending on whether it's in a pipeline:
grep() {
if [[ -t 1 ]]; then
command grep -n "$@"
else
command grep "$@"
fi
}
It's a perfect example of a function because it is too complex for an alias (requiring different defaults based on a condition), but it's not something you'll need in a non-interactive script.
If you get too many functions or functions too big, put them into separate files in a hidden directory, and source them in your ~/.bashrc
:
if [ -d ~/.bash_functions ]; then
for file in ~/.bash_functions/*; do
. "$file"
done
fi
A script should stand on its own. It should have value as something that can be re-used, or used for more than one purpose.
An alias should effectively not (in general) do more than change the default options of a command. It is nothing more than simple text replacement on the command name. It can't do anything with arguments but pass them to the command it actually runs. So if you simply need to add an argument at the front of a single command, an alias will work. Common examples are
# Make ls output in color by default.
alias ls="ls --color=auto"
# make mv ask before overwriting a file by default
alias mv="mv -i"
A function should be used when you need to do something more complex than an alias but that wouldn't be of use on its own. For example, take this answer on a question I asked about changing grep
's default behavior depending on whether it's in a pipeline:
grep() {
if [[ -t 1 ]]; then
command grep -n "$@"
else
command grep "$@"
fi
}
It's a perfect example of a function because it is too complex for an alias (requiring different defaults based on a condition), but it's not something you'll need in a non-interactive script.
If you get too many functions or functions too big, put them into separate files in a hidden directory, and source them in your ~/.bashrc
:
if [ -d ~/.bash_functions ]; then
for file in ~/.bash_functions/*; do
. "$file"
done
fi
A script should stand on its own. It should have value as something that can be re-used, or used for more than one purpose.
edited Apr 13 '17 at 12:37
Community♦
1
1
answered Feb 5 '12 at 19:00
KevinKevin
29.3k11 gold badges70 silver badges106 bronze badges
29.3k11 gold badges70 silver badges106 bronze badges
12
It's also important to remember that – unless sourced with.
orsource
– a script is executed by separate bash process and has its own environment. For this reason, anything that modifies the shell environment (e.g. functions, variables, etc.) will not persist in the shell environment from which you run the script.
– Will Vousden
Mar 5 '15 at 11:02
add a comment
|
12
It's also important to remember that – unless sourced with.
orsource
– a script is executed by separate bash process and has its own environment. For this reason, anything that modifies the shell environment (e.g. functions, variables, etc.) will not persist in the shell environment from which you run the script.
– Will Vousden
Mar 5 '15 at 11:02
12
12
It's also important to remember that – unless sourced with
.
or source
– a script is executed by separate bash process and has its own environment. For this reason, anything that modifies the shell environment (e.g. functions, variables, etc.) will not persist in the shell environment from which you run the script.– Will Vousden
Mar 5 '15 at 11:02
It's also important to remember that – unless sourced with
.
or source
– a script is executed by separate bash process and has its own environment. For this reason, anything that modifies the shell environment (e.g. functions, variables, etc.) will not persist in the shell environment from which you run the script.– Will Vousden
Mar 5 '15 at 11:02
add a comment
|
The other answers provide some soft general guidelines based on personal taste, but ignore many pertinent facts that one should consider when deciding between scripts, functions, or aliases.
Aliases and Functions ¹
- The entire contents of aliases and functions are stored in the shell's memory.
- A natural consequence of this is aliases and functions can only be used by the current shell, and not by any other programs you may invoke from the shell like text editors, scripts, or even child instances of the same shell.
- Aliases and functions are executed by the current shell, i.e. they run within and affect the shell's current environment.² No separate process is necessary to run an alias or function.
Scripts
- Shells do not keep scripts in memory. Instead, scripts are read from the files where they are stored every time they are needed. If the script is found via a
$PATH
search, many shells store a hash of its path name in memory to save time on future$PATH
look-ups, but that is the extent of a script's memory footprint when not in use.
Scripts can be invoked in more ways than functions and aliases can. They can be passed as an argument to an interpreter, like
sh script
, or invoked directly as an executable, in which case the interpreter in the shebang line (e.g.#!/bin/sh
) is invoked to run it. In both cases, the script is run by a separate interpreter process with its own environment separate from that of your shell, whose environment the script cannot affect in any way. Indeed, the interpreter shell does not even have to match the invoking shell. Because scripts invoked this way appear to behave like any ordinary executable, they can be used by any program.
Finally, a script can be read and run by the current shell with
.
, or in some shells,source
. In this case, the script behaves much like a function that is read on-demand instead of being constantly kept in memory.
Application
Given the above, we can come up with some general guidelines for whether to make something a script or function / alias.
Do other programs besides your shell need to be able to use it? If so, it has to be a script.
Do you only want it to be available from an interactive shell? It's common to want to change the default behavior of many commands when run interactively without affecting external commands / scripts. For this case, use an alias / function set in the shell's "interactive-mode-only" rc file (for
bash
this is.bashrc
).Does it need to change the shell's environment? Both a function / alias or a sourced script are possible choices.
Is it something you use frequently? It's probably more efficient to keep it in memory, so make it a function / alias if possible.
Conversely, is it something you use only rarely? In that case, there's no sense having it hog memory when you don't need it, so make it a script.
¹ While functions and aliases have some important differences, they are grouped together because functions can do everything aliases can. Aliases can not have local variables nor can they process arguments, and they are inconvenient for anything longer than one line.
² Every running process in a Unix system has an environment consisting of a bunch of variable=value
pairs which often contain global configuration settings, like LANG
for the default locale and PATH
for specifying executable search path.
26
IMHO This is the best answer.
– Luc M
Feb 8 '12 at 18:51
4
The question/answer format is a great idea. I might steal that. ;-)
– Mikel
May 9 '12 at 15:46
4
Worth noting: if two (or more) scripts need to share some code, it's probably best to put that code into a function which is itself located in a third file that both of those scripts import/source.
– kbolino
Sep 21 '16 at 19:40
3
Another item to add to that list of questions: Do you ever need to change functionality in the command on the fly? changes to a script will be reflected in all sessions, whereas functions and aliases must be reloaded or redefined on a per session basis.
– Stratus3D
Apr 14 '17 at 21:02
3
Good answer. One more important thing (for me): when creating a "shortcut" to other utils, it's better to use an alias because existing autocomplete will just work with aliases, but not with scripts or functions (so +1 for aliases). e.g. By creating analias g='gradle'
I get gradle autocompletion when using myg
alias, but won't get it out-of-the-box when using a script withgradle $*
or a function withgradle $@
– Yoav Aharoni
Feb 4 '18 at 14:29
|
show 8 more comments
The other answers provide some soft general guidelines based on personal taste, but ignore many pertinent facts that one should consider when deciding between scripts, functions, or aliases.
Aliases and Functions ¹
- The entire contents of aliases and functions are stored in the shell's memory.
- A natural consequence of this is aliases and functions can only be used by the current shell, and not by any other programs you may invoke from the shell like text editors, scripts, or even child instances of the same shell.
- Aliases and functions are executed by the current shell, i.e. they run within and affect the shell's current environment.² No separate process is necessary to run an alias or function.
Scripts
- Shells do not keep scripts in memory. Instead, scripts are read from the files where they are stored every time they are needed. If the script is found via a
$PATH
search, many shells store a hash of its path name in memory to save time on future$PATH
look-ups, but that is the extent of a script's memory footprint when not in use.
Scripts can be invoked in more ways than functions and aliases can. They can be passed as an argument to an interpreter, like
sh script
, or invoked directly as an executable, in which case the interpreter in the shebang line (e.g.#!/bin/sh
) is invoked to run it. In both cases, the script is run by a separate interpreter process with its own environment separate from that of your shell, whose environment the script cannot affect in any way. Indeed, the interpreter shell does not even have to match the invoking shell. Because scripts invoked this way appear to behave like any ordinary executable, they can be used by any program.
Finally, a script can be read and run by the current shell with
.
, or in some shells,source
. In this case, the script behaves much like a function that is read on-demand instead of being constantly kept in memory.
Application
Given the above, we can come up with some general guidelines for whether to make something a script or function / alias.
Do other programs besides your shell need to be able to use it? If so, it has to be a script.
Do you only want it to be available from an interactive shell? It's common to want to change the default behavior of many commands when run interactively without affecting external commands / scripts. For this case, use an alias / function set in the shell's "interactive-mode-only" rc file (for
bash
this is.bashrc
).Does it need to change the shell's environment? Both a function / alias or a sourced script are possible choices.
Is it something you use frequently? It's probably more efficient to keep it in memory, so make it a function / alias if possible.
Conversely, is it something you use only rarely? In that case, there's no sense having it hog memory when you don't need it, so make it a script.
¹ While functions and aliases have some important differences, they are grouped together because functions can do everything aliases can. Aliases can not have local variables nor can they process arguments, and they are inconvenient for anything longer than one line.
² Every running process in a Unix system has an environment consisting of a bunch of variable=value
pairs which often contain global configuration settings, like LANG
for the default locale and PATH
for specifying executable search path.
26
IMHO This is the best answer.
– Luc M
Feb 8 '12 at 18:51
4
The question/answer format is a great idea. I might steal that. ;-)
– Mikel
May 9 '12 at 15:46
4
Worth noting: if two (or more) scripts need to share some code, it's probably best to put that code into a function which is itself located in a third file that both of those scripts import/source.
– kbolino
Sep 21 '16 at 19:40
3
Another item to add to that list of questions: Do you ever need to change functionality in the command on the fly? changes to a script will be reflected in all sessions, whereas functions and aliases must be reloaded or redefined on a per session basis.
– Stratus3D
Apr 14 '17 at 21:02
3
Good answer. One more important thing (for me): when creating a "shortcut" to other utils, it's better to use an alias because existing autocomplete will just work with aliases, but not with scripts or functions (so +1 for aliases). e.g. By creating analias g='gradle'
I get gradle autocompletion when using myg
alias, but won't get it out-of-the-box when using a script withgradle $*
or a function withgradle $@
– Yoav Aharoni
Feb 4 '18 at 14:29
|
show 8 more comments
The other answers provide some soft general guidelines based on personal taste, but ignore many pertinent facts that one should consider when deciding between scripts, functions, or aliases.
Aliases and Functions ¹
- The entire contents of aliases and functions are stored in the shell's memory.
- A natural consequence of this is aliases and functions can only be used by the current shell, and not by any other programs you may invoke from the shell like text editors, scripts, or even child instances of the same shell.
- Aliases and functions are executed by the current shell, i.e. they run within and affect the shell's current environment.² No separate process is necessary to run an alias or function.
Scripts
- Shells do not keep scripts in memory. Instead, scripts are read from the files where they are stored every time they are needed. If the script is found via a
$PATH
search, many shells store a hash of its path name in memory to save time on future$PATH
look-ups, but that is the extent of a script's memory footprint when not in use.
Scripts can be invoked in more ways than functions and aliases can. They can be passed as an argument to an interpreter, like
sh script
, or invoked directly as an executable, in which case the interpreter in the shebang line (e.g.#!/bin/sh
) is invoked to run it. In both cases, the script is run by a separate interpreter process with its own environment separate from that of your shell, whose environment the script cannot affect in any way. Indeed, the interpreter shell does not even have to match the invoking shell. Because scripts invoked this way appear to behave like any ordinary executable, they can be used by any program.
Finally, a script can be read and run by the current shell with
.
, or in some shells,source
. In this case, the script behaves much like a function that is read on-demand instead of being constantly kept in memory.
Application
Given the above, we can come up with some general guidelines for whether to make something a script or function / alias.
Do other programs besides your shell need to be able to use it? If so, it has to be a script.
Do you only want it to be available from an interactive shell? It's common to want to change the default behavior of many commands when run interactively without affecting external commands / scripts. For this case, use an alias / function set in the shell's "interactive-mode-only" rc file (for
bash
this is.bashrc
).Does it need to change the shell's environment? Both a function / alias or a sourced script are possible choices.
Is it something you use frequently? It's probably more efficient to keep it in memory, so make it a function / alias if possible.
Conversely, is it something you use only rarely? In that case, there's no sense having it hog memory when you don't need it, so make it a script.
¹ While functions and aliases have some important differences, they are grouped together because functions can do everything aliases can. Aliases can not have local variables nor can they process arguments, and they are inconvenient for anything longer than one line.
² Every running process in a Unix system has an environment consisting of a bunch of variable=value
pairs which often contain global configuration settings, like LANG
for the default locale and PATH
for specifying executable search path.
The other answers provide some soft general guidelines based on personal taste, but ignore many pertinent facts that one should consider when deciding between scripts, functions, or aliases.
Aliases and Functions ¹
- The entire contents of aliases and functions are stored in the shell's memory.
- A natural consequence of this is aliases and functions can only be used by the current shell, and not by any other programs you may invoke from the shell like text editors, scripts, or even child instances of the same shell.
- Aliases and functions are executed by the current shell, i.e. they run within and affect the shell's current environment.² No separate process is necessary to run an alias or function.
Scripts
- Shells do not keep scripts in memory. Instead, scripts are read from the files where they are stored every time they are needed. If the script is found via a
$PATH
search, many shells store a hash of its path name in memory to save time on future$PATH
look-ups, but that is the extent of a script's memory footprint when not in use.
Scripts can be invoked in more ways than functions and aliases can. They can be passed as an argument to an interpreter, like
sh script
, or invoked directly as an executable, in which case the interpreter in the shebang line (e.g.#!/bin/sh
) is invoked to run it. In both cases, the script is run by a separate interpreter process with its own environment separate from that of your shell, whose environment the script cannot affect in any way. Indeed, the interpreter shell does not even have to match the invoking shell. Because scripts invoked this way appear to behave like any ordinary executable, they can be used by any program.
Finally, a script can be read and run by the current shell with
.
, or in some shells,source
. In this case, the script behaves much like a function that is read on-demand instead of being constantly kept in memory.
Application
Given the above, we can come up with some general guidelines for whether to make something a script or function / alias.
Do other programs besides your shell need to be able to use it? If so, it has to be a script.
Do you only want it to be available from an interactive shell? It's common to want to change the default behavior of many commands when run interactively without affecting external commands / scripts. For this case, use an alias / function set in the shell's "interactive-mode-only" rc file (for
bash
this is.bashrc
).Does it need to change the shell's environment? Both a function / alias or a sourced script are possible choices.
Is it something you use frequently? It's probably more efficient to keep it in memory, so make it a function / alias if possible.
Conversely, is it something you use only rarely? In that case, there's no sense having it hog memory when you don't need it, so make it a script.
¹ While functions and aliases have some important differences, they are grouped together because functions can do everything aliases can. Aliases can not have local variables nor can they process arguments, and they are inconvenient for anything longer than one line.
² Every running process in a Unix system has an environment consisting of a bunch of variable=value
pairs which often contain global configuration settings, like LANG
for the default locale and PATH
for specifying executable search path.
edited Sep 8 '12 at 0:52
Robbie
1032 bronze badges
1032 bronze badges
answered Feb 5 '12 at 21:49
jw013jw013
38.8k8 gold badges107 silver badges127 bronze badges
38.8k8 gold badges107 silver badges127 bronze badges
26
IMHO This is the best answer.
– Luc M
Feb 8 '12 at 18:51
4
The question/answer format is a great idea. I might steal that. ;-)
– Mikel
May 9 '12 at 15:46
4
Worth noting: if two (or more) scripts need to share some code, it's probably best to put that code into a function which is itself located in a third file that both of those scripts import/source.
– kbolino
Sep 21 '16 at 19:40
3
Another item to add to that list of questions: Do you ever need to change functionality in the command on the fly? changes to a script will be reflected in all sessions, whereas functions and aliases must be reloaded or redefined on a per session basis.
– Stratus3D
Apr 14 '17 at 21:02
3
Good answer. One more important thing (for me): when creating a "shortcut" to other utils, it's better to use an alias because existing autocomplete will just work with aliases, but not with scripts or functions (so +1 for aliases). e.g. By creating analias g='gradle'
I get gradle autocompletion when using myg
alias, but won't get it out-of-the-box when using a script withgradle $*
or a function withgradle $@
– Yoav Aharoni
Feb 4 '18 at 14:29
|
show 8 more comments
26
IMHO This is the best answer.
– Luc M
Feb 8 '12 at 18:51
4
The question/answer format is a great idea. I might steal that. ;-)
– Mikel
May 9 '12 at 15:46
4
Worth noting: if two (or more) scripts need to share some code, it's probably best to put that code into a function which is itself located in a third file that both of those scripts import/source.
– kbolino
Sep 21 '16 at 19:40
3
Another item to add to that list of questions: Do you ever need to change functionality in the command on the fly? changes to a script will be reflected in all sessions, whereas functions and aliases must be reloaded or redefined on a per session basis.
– Stratus3D
Apr 14 '17 at 21:02
3
Good answer. One more important thing (for me): when creating a "shortcut" to other utils, it's better to use an alias because existing autocomplete will just work with aliases, but not with scripts or functions (so +1 for aliases). e.g. By creating analias g='gradle'
I get gradle autocompletion when using myg
alias, but won't get it out-of-the-box when using a script withgradle $*
or a function withgradle $@
– Yoav Aharoni
Feb 4 '18 at 14:29
26
26
IMHO This is the best answer.
– Luc M
Feb 8 '12 at 18:51
IMHO This is the best answer.
– Luc M
Feb 8 '12 at 18:51
4
4
The question/answer format is a great idea. I might steal that. ;-)
– Mikel
May 9 '12 at 15:46
The question/answer format is a great idea. I might steal that. ;-)
– Mikel
May 9 '12 at 15:46
4
4
Worth noting: if two (or more) scripts need to share some code, it's probably best to put that code into a function which is itself located in a third file that both of those scripts import/source.
– kbolino
Sep 21 '16 at 19:40
Worth noting: if two (or more) scripts need to share some code, it's probably best to put that code into a function which is itself located in a third file that both of those scripts import/source.
– kbolino
Sep 21 '16 at 19:40
3
3
Another item to add to that list of questions: Do you ever need to change functionality in the command on the fly? changes to a script will be reflected in all sessions, whereas functions and aliases must be reloaded or redefined on a per session basis.
– Stratus3D
Apr 14 '17 at 21:02
Another item to add to that list of questions: Do you ever need to change functionality in the command on the fly? changes to a script will be reflected in all sessions, whereas functions and aliases must be reloaded or redefined on a per session basis.
– Stratus3D
Apr 14 '17 at 21:02
3
3
Good answer. One more important thing (for me): when creating a "shortcut" to other utils, it's better to use an alias because existing autocomplete will just work with aliases, but not with scripts or functions (so +1 for aliases). e.g. By creating an
alias g='gradle'
I get gradle autocompletion when using my g
alias, but won't get it out-of-the-box when using a script with gradle $*
or a function with gradle $@
– Yoav Aharoni
Feb 4 '18 at 14:29
Good answer. One more important thing (for me): when creating a "shortcut" to other utils, it's better to use an alias because existing autocomplete will just work with aliases, but not with scripts or functions (so +1 for aliases). e.g. By creating an
alias g='gradle'
I get gradle autocompletion when using my g
alias, but won't get it out-of-the-box when using a script with gradle $*
or a function with gradle $@
– Yoav Aharoni
Feb 4 '18 at 14:29
|
show 8 more comments
I think it's up to each person's taste. For me the logic goes like this:
- First I try to make an alias, because it's the simplest.
- If the thing is too complicated to fit in one line, I try to make it a function.
- When the function starts to grow beyond a dozen of lines I put it in a script.
There is really nothing to restrict you from doing something that works.
6
I often skip the function option, and make a script right away. But I agree that it is partly a matter of taste
– Bernhard
Feb 5 '12 at 15:00
2
A function begins to make sense if you need it in several scripts.
– Nils
Feb 10 '12 at 21:45
7
... or if you need the side-effects to alter the current shell.
– glenn jackman
Jul 27 '15 at 16:30
makes sense, man!
– explorer
May 13 at 4:18
add a comment
|
I think it's up to each person's taste. For me the logic goes like this:
- First I try to make an alias, because it's the simplest.
- If the thing is too complicated to fit in one line, I try to make it a function.
- When the function starts to grow beyond a dozen of lines I put it in a script.
There is really nothing to restrict you from doing something that works.
6
I often skip the function option, and make a script right away. But I agree that it is partly a matter of taste
– Bernhard
Feb 5 '12 at 15:00
2
A function begins to make sense if you need it in several scripts.
– Nils
Feb 10 '12 at 21:45
7
... or if you need the side-effects to alter the current shell.
– glenn jackman
Jul 27 '15 at 16:30
makes sense, man!
– explorer
May 13 at 4:18
add a comment
|
I think it's up to each person's taste. For me the logic goes like this:
- First I try to make an alias, because it's the simplest.
- If the thing is too complicated to fit in one line, I try to make it a function.
- When the function starts to grow beyond a dozen of lines I put it in a script.
There is really nothing to restrict you from doing something that works.
I think it's up to each person's taste. For me the logic goes like this:
- First I try to make an alias, because it's the simplest.
- If the thing is too complicated to fit in one line, I try to make it a function.
- When the function starts to grow beyond a dozen of lines I put it in a script.
There is really nothing to restrict you from doing something that works.
answered Feb 5 '12 at 14:52
phunehehephunehehe
12.6k20 gold badges85 silver badges141 bronze badges
12.6k20 gold badges85 silver badges141 bronze badges
6
I often skip the function option, and make a script right away. But I agree that it is partly a matter of taste
– Bernhard
Feb 5 '12 at 15:00
2
A function begins to make sense if you need it in several scripts.
– Nils
Feb 10 '12 at 21:45
7
... or if you need the side-effects to alter the current shell.
– glenn jackman
Jul 27 '15 at 16:30
makes sense, man!
– explorer
May 13 at 4:18
add a comment
|
6
I often skip the function option, and make a script right away. But I agree that it is partly a matter of taste
– Bernhard
Feb 5 '12 at 15:00
2
A function begins to make sense if you need it in several scripts.
– Nils
Feb 10 '12 at 21:45
7
... or if you need the side-effects to alter the current shell.
– glenn jackman
Jul 27 '15 at 16:30
makes sense, man!
– explorer
May 13 at 4:18
6
6
I often skip the function option, and make a script right away. But I agree that it is partly a matter of taste
– Bernhard
Feb 5 '12 at 15:00
I often skip the function option, and make a script right away. But I agree that it is partly a matter of taste
– Bernhard
Feb 5 '12 at 15:00
2
2
A function begins to make sense if you need it in several scripts.
– Nils
Feb 10 '12 at 21:45
A function begins to make sense if you need it in several scripts.
– Nils
Feb 10 '12 at 21:45
7
7
... or if you need the side-effects to alter the current shell.
– glenn jackman
Jul 27 '15 at 16:30
... or if you need the side-effects to alter the current shell.
– glenn jackman
Jul 27 '15 at 16:30
makes sense, man!
– explorer
May 13 at 4:18
makes sense, man!
– explorer
May 13 at 4:18
add a comment
|
At least partially it's a matter of personal taste. On the other hand there are some clear functional distinctions:
- aliases: only suitable for simple text replacements, no arguments/parameters
- functions: easy to write/use, full shell scripting capability, only available inside bash
- scripts: more or less like functions, but available (callable) outside of bash as well
Looking at shell scripting I've done the last few years I have more or less stopped writing aliases (because they all tend to grow into functions over time) and do scripts only if they need to be available also from non-bash environments.
PS: As for alias command="bash bashscriptname"
I don't actually see any reason to do this. Even if bashscriptname
is not in $PATH, a simple alias c=/path/to/script
would be enough.
1
Inalias command="bash bashscriptname"
the script does not necessarily have to be executable; in thealias c=/path/to/script
it has to.
– Martin - マーチン
Jul 24 '18 at 16:29
It is not true at all that functions are "only available inside Bash". If you mean to say they are a Bash-only feature, that is simply false (Bourne shell and every compatible derivative has them); and if you mean to say they are a feature of interactive shells, that's not accurate either (though aliases, variables, and functions defined in a file which gets loaded at startup by interactive shells obviously will not be loaded by noninteractive shells).
– tripleee
Aug 19 '18 at 8:10
@tripleee The meaning was more like "you can'texec()
shell functions" :-)
– nohillside
Sep 17 '18 at 8:50
add a comment
|
At least partially it's a matter of personal taste. On the other hand there are some clear functional distinctions:
- aliases: only suitable for simple text replacements, no arguments/parameters
- functions: easy to write/use, full shell scripting capability, only available inside bash
- scripts: more or less like functions, but available (callable) outside of bash as well
Looking at shell scripting I've done the last few years I have more or less stopped writing aliases (because they all tend to grow into functions over time) and do scripts only if they need to be available also from non-bash environments.
PS: As for alias command="bash bashscriptname"
I don't actually see any reason to do this. Even if bashscriptname
is not in $PATH, a simple alias c=/path/to/script
would be enough.
1
Inalias command="bash bashscriptname"
the script does not necessarily have to be executable; in thealias c=/path/to/script
it has to.
– Martin - マーチン
Jul 24 '18 at 16:29
It is not true at all that functions are "only available inside Bash". If you mean to say they are a Bash-only feature, that is simply false (Bourne shell and every compatible derivative has them); and if you mean to say they are a feature of interactive shells, that's not accurate either (though aliases, variables, and functions defined in a file which gets loaded at startup by interactive shells obviously will not be loaded by noninteractive shells).
– tripleee
Aug 19 '18 at 8:10
@tripleee The meaning was more like "you can'texec()
shell functions" :-)
– nohillside
Sep 17 '18 at 8:50
add a comment
|
At least partially it's a matter of personal taste. On the other hand there are some clear functional distinctions:
- aliases: only suitable for simple text replacements, no arguments/parameters
- functions: easy to write/use, full shell scripting capability, only available inside bash
- scripts: more or less like functions, but available (callable) outside of bash as well
Looking at shell scripting I've done the last few years I have more or less stopped writing aliases (because they all tend to grow into functions over time) and do scripts only if they need to be available also from non-bash environments.
PS: As for alias command="bash bashscriptname"
I don't actually see any reason to do this. Even if bashscriptname
is not in $PATH, a simple alias c=/path/to/script
would be enough.
At least partially it's a matter of personal taste. On the other hand there are some clear functional distinctions:
- aliases: only suitable for simple text replacements, no arguments/parameters
- functions: easy to write/use, full shell scripting capability, only available inside bash
- scripts: more or less like functions, but available (callable) outside of bash as well
Looking at shell scripting I've done the last few years I have more or less stopped writing aliases (because they all tend to grow into functions over time) and do scripts only if they need to be available also from non-bash environments.
PS: As for alias command="bash bashscriptname"
I don't actually see any reason to do this. Even if bashscriptname
is not in $PATH, a simple alias c=/path/to/script
would be enough.
answered Feb 5 '12 at 15:08


nohillsidenohillside
2,55312 silver badges21 bronze badges
2,55312 silver badges21 bronze badges
1
Inalias command="bash bashscriptname"
the script does not necessarily have to be executable; in thealias c=/path/to/script
it has to.
– Martin - マーチン
Jul 24 '18 at 16:29
It is not true at all that functions are "only available inside Bash". If you mean to say they are a Bash-only feature, that is simply false (Bourne shell and every compatible derivative has them); and if you mean to say they are a feature of interactive shells, that's not accurate either (though aliases, variables, and functions defined in a file which gets loaded at startup by interactive shells obviously will not be loaded by noninteractive shells).
– tripleee
Aug 19 '18 at 8:10
@tripleee The meaning was more like "you can'texec()
shell functions" :-)
– nohillside
Sep 17 '18 at 8:50
add a comment
|
1
Inalias command="bash bashscriptname"
the script does not necessarily have to be executable; in thealias c=/path/to/script
it has to.
– Martin - マーチン
Jul 24 '18 at 16:29
It is not true at all that functions are "only available inside Bash". If you mean to say they are a Bash-only feature, that is simply false (Bourne shell and every compatible derivative has them); and if you mean to say they are a feature of interactive shells, that's not accurate either (though aliases, variables, and functions defined in a file which gets loaded at startup by interactive shells obviously will not be loaded by noninteractive shells).
– tripleee
Aug 19 '18 at 8:10
@tripleee The meaning was more like "you can'texec()
shell functions" :-)
– nohillside
Sep 17 '18 at 8:50
1
1
In
alias command="bash bashscriptname"
the script does not necessarily have to be executable; in the alias c=/path/to/script
it has to.– Martin - マーチン
Jul 24 '18 at 16:29
In
alias command="bash bashscriptname"
the script does not necessarily have to be executable; in the alias c=/path/to/script
it has to.– Martin - マーチン
Jul 24 '18 at 16:29
It is not true at all that functions are "only available inside Bash". If you mean to say they are a Bash-only feature, that is simply false (Bourne shell and every compatible derivative has them); and if you mean to say they are a feature of interactive shells, that's not accurate either (though aliases, variables, and functions defined in a file which gets loaded at startup by interactive shells obviously will not be loaded by noninteractive shells).
– tripleee
Aug 19 '18 at 8:10
It is not true at all that functions are "only available inside Bash". If you mean to say they are a Bash-only feature, that is simply false (Bourne shell and every compatible derivative has them); and if you mean to say they are a feature of interactive shells, that's not accurate either (though aliases, variables, and functions defined in a file which gets loaded at startup by interactive shells obviously will not be loaded by noninteractive shells).
– tripleee
Aug 19 '18 at 8:10
@tripleee The meaning was more like "you can't
exec()
shell functions" :-)– nohillside
Sep 17 '18 at 8:50
@tripleee The meaning was more like "you can't
exec()
shell functions" :-)– nohillside
Sep 17 '18 at 8:50
add a comment
|
Here are some additional points about aliases and functions:
Same-named alias and function can co-exist- alias namespace is looked up first (see first example)
- aliases cannot be (un)set in subshells or non-interactive environment (see second example)
For example:
alias f='echo Alias'; f # prints "Alias"
function f { echo 'Function'; }; f # prints "Alias"
unalias f; f # prints "Function"
As we can see, there are separate namespaces for aliases and functions; more details can be found using declare -A -p BASH_ALIASES
and declare -f f
, which prints their definitions (both are stored in memory).
Example showing limitations of aliases:
alias a='echo Alias'
a # OK: prints "Alias"
eval a; # OK: prints "Alias"
( alias a="Nested"; a ); # prints "Alias" (not "Nested")
( unalias a; a ); # prints "Alias"
bash -c "alias aa='Another Alias'; aa" # ERROR: bash: aa: command not found
As we can see aliases are not nestable, unlike functions. Also, their usage is limited to the interactive sessions.
Finally, note that you can have arbitrary computation in an alias by declaring a function a immediately calling it, like so:
alias a_complex_thing='f() { do_stuff_in_function; } f'
which is already in widespread use in case of Git aliases. The benefit of doing so over declaring a function is that your alias cannot be simply overwritten by source-ing (or using .
) a script which happens to declare a same-named function.
add a comment
|
Here are some additional points about aliases and functions:
Same-named alias and function can co-exist- alias namespace is looked up first (see first example)
- aliases cannot be (un)set in subshells or non-interactive environment (see second example)
For example:
alias f='echo Alias'; f # prints "Alias"
function f { echo 'Function'; }; f # prints "Alias"
unalias f; f # prints "Function"
As we can see, there are separate namespaces for aliases and functions; more details can be found using declare -A -p BASH_ALIASES
and declare -f f
, which prints their definitions (both are stored in memory).
Example showing limitations of aliases:
alias a='echo Alias'
a # OK: prints "Alias"
eval a; # OK: prints "Alias"
( alias a="Nested"; a ); # prints "Alias" (not "Nested")
( unalias a; a ); # prints "Alias"
bash -c "alias aa='Another Alias'; aa" # ERROR: bash: aa: command not found
As we can see aliases are not nestable, unlike functions. Also, their usage is limited to the interactive sessions.
Finally, note that you can have arbitrary computation in an alias by declaring a function a immediately calling it, like so:
alias a_complex_thing='f() { do_stuff_in_function; } f'
which is already in widespread use in case of Git aliases. The benefit of doing so over declaring a function is that your alias cannot be simply overwritten by source-ing (or using .
) a script which happens to declare a same-named function.
add a comment
|
Here are some additional points about aliases and functions:
Same-named alias and function can co-exist- alias namespace is looked up first (see first example)
- aliases cannot be (un)set in subshells or non-interactive environment (see second example)
For example:
alias f='echo Alias'; f # prints "Alias"
function f { echo 'Function'; }; f # prints "Alias"
unalias f; f # prints "Function"
As we can see, there are separate namespaces for aliases and functions; more details can be found using declare -A -p BASH_ALIASES
and declare -f f
, which prints their definitions (both are stored in memory).
Example showing limitations of aliases:
alias a='echo Alias'
a # OK: prints "Alias"
eval a; # OK: prints "Alias"
( alias a="Nested"; a ); # prints "Alias" (not "Nested")
( unalias a; a ); # prints "Alias"
bash -c "alias aa='Another Alias'; aa" # ERROR: bash: aa: command not found
As we can see aliases are not nestable, unlike functions. Also, their usage is limited to the interactive sessions.
Finally, note that you can have arbitrary computation in an alias by declaring a function a immediately calling it, like so:
alias a_complex_thing='f() { do_stuff_in_function; } f'
which is already in widespread use in case of Git aliases. The benefit of doing so over declaring a function is that your alias cannot be simply overwritten by source-ing (or using .
) a script which happens to declare a same-named function.
Here are some additional points about aliases and functions:
Same-named alias and function can co-exist- alias namespace is looked up first (see first example)
- aliases cannot be (un)set in subshells or non-interactive environment (see second example)
For example:
alias f='echo Alias'; f # prints "Alias"
function f { echo 'Function'; }; f # prints "Alias"
unalias f; f # prints "Function"
As we can see, there are separate namespaces for aliases and functions; more details can be found using declare -A -p BASH_ALIASES
and declare -f f
, which prints their definitions (both are stored in memory).
Example showing limitations of aliases:
alias a='echo Alias'
a # OK: prints "Alias"
eval a; # OK: prints "Alias"
( alias a="Nested"; a ); # prints "Alias" (not "Nested")
( unalias a; a ); # prints "Alias"
bash -c "alias aa='Another Alias'; aa" # ERROR: bash: aa: command not found
As we can see aliases are not nestable, unlike functions. Also, their usage is limited to the interactive sessions.
Finally, note that you can have arbitrary computation in an alias by declaring a function a immediately calling it, like so:
alias a_complex_thing='f() { do_stuff_in_function; } f'
which is already in widespread use in case of Git aliases. The benefit of doing so over declaring a function is that your alias cannot be simply overwritten by source-ing (or using .
) a script which happens to declare a same-named function.
answered Oct 3 '15 at 20:25
ledenleden
2463 silver badges6 bronze badges
2463 silver badges6 bronze badges
add a comment
|
add a comment
|
When to write a script ...
- Scripts assemble software components (aka. tools, commands, processes, executables, programs) into more complex components, which may themselves be assembled into still more complex components.
- Scripts are usually made executable so they can be called by name. When called, a new subprocess is spawned for the script to run in. Copies of any
export
ed variables and/or functions are passed by value to the script. Changes to those variables do not propagate back to the parent script. - Scripts may also be loaded(sourced) as if they were part of the calling script. This is analogous to what some other languages call "import" or "include". When sourced, they execute within the existing process. No subprocess is spawned.
When to write a function ...
- Functions are effectively pre-loaded shell scripts. They perform a bit better than calling a separate script, but only if it must be read from mechanical disk. Today's proliferation of flashdrives, SSDs and Linux's normal caching in unused RAM make that improvement largely unmeasurable.
- Functions serve as bash's principle means of achieving modularity, encapsulation and reuse. They improve the clarity, reliability and maintainability of scripts.
- The syntax rules for calling a function are identical to that of calling an executable. A function with the same name as an executable would be invoked instead of the executable.
- Functions are local to the script they are in.
- Functions may be exported (copied by value) so they can be used inside called scripts. Thus, functions only propagate to child processes, never parents.
- Functions create reusable commands that are often assembled into libraries (a script with only function definitions) to be sourced by other scripts.
When to write an alias ...
- Bash aliases don't work inside shell script constructs like if/then and for/do loops, so should only be used as keyboard shortcuts on an interactive commandline. Thus, all alias definitions usually reside inside the appropriate login script like
~/.profile
or~/.bashrc
.
Within scripts like library scripts, sometimes an alias for a function is needed, such as when a function is renamed but backward compatibility is required. This can be accomplished by creating a simple function with the old name that passes all its arguments to the
new function...
# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }
add a comment
|
When to write a script ...
- Scripts assemble software components (aka. tools, commands, processes, executables, programs) into more complex components, which may themselves be assembled into still more complex components.
- Scripts are usually made executable so they can be called by name. When called, a new subprocess is spawned for the script to run in. Copies of any
export
ed variables and/or functions are passed by value to the script. Changes to those variables do not propagate back to the parent script. - Scripts may also be loaded(sourced) as if they were part of the calling script. This is analogous to what some other languages call "import" or "include". When sourced, they execute within the existing process. No subprocess is spawned.
When to write a function ...
- Functions are effectively pre-loaded shell scripts. They perform a bit better than calling a separate script, but only if it must be read from mechanical disk. Today's proliferation of flashdrives, SSDs and Linux's normal caching in unused RAM make that improvement largely unmeasurable.
- Functions serve as bash's principle means of achieving modularity, encapsulation and reuse. They improve the clarity, reliability and maintainability of scripts.
- The syntax rules for calling a function are identical to that of calling an executable. A function with the same name as an executable would be invoked instead of the executable.
- Functions are local to the script they are in.
- Functions may be exported (copied by value) so they can be used inside called scripts. Thus, functions only propagate to child processes, never parents.
- Functions create reusable commands that are often assembled into libraries (a script with only function definitions) to be sourced by other scripts.
When to write an alias ...
- Bash aliases don't work inside shell script constructs like if/then and for/do loops, so should only be used as keyboard shortcuts on an interactive commandline. Thus, all alias definitions usually reside inside the appropriate login script like
~/.profile
or~/.bashrc
.
Within scripts like library scripts, sometimes an alias for a function is needed, such as when a function is renamed but backward compatibility is required. This can be accomplished by creating a simple function with the old name that passes all its arguments to the
new function...
# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }
add a comment
|
When to write a script ...
- Scripts assemble software components (aka. tools, commands, processes, executables, programs) into more complex components, which may themselves be assembled into still more complex components.
- Scripts are usually made executable so they can be called by name. When called, a new subprocess is spawned for the script to run in. Copies of any
export
ed variables and/or functions are passed by value to the script. Changes to those variables do not propagate back to the parent script. - Scripts may also be loaded(sourced) as if they were part of the calling script. This is analogous to what some other languages call "import" or "include". When sourced, they execute within the existing process. No subprocess is spawned.
When to write a function ...
- Functions are effectively pre-loaded shell scripts. They perform a bit better than calling a separate script, but only if it must be read from mechanical disk. Today's proliferation of flashdrives, SSDs and Linux's normal caching in unused RAM make that improvement largely unmeasurable.
- Functions serve as bash's principle means of achieving modularity, encapsulation and reuse. They improve the clarity, reliability and maintainability of scripts.
- The syntax rules for calling a function are identical to that of calling an executable. A function with the same name as an executable would be invoked instead of the executable.
- Functions are local to the script they are in.
- Functions may be exported (copied by value) so they can be used inside called scripts. Thus, functions only propagate to child processes, never parents.
- Functions create reusable commands that are often assembled into libraries (a script with only function definitions) to be sourced by other scripts.
When to write an alias ...
- Bash aliases don't work inside shell script constructs like if/then and for/do loops, so should only be used as keyboard shortcuts on an interactive commandline. Thus, all alias definitions usually reside inside the appropriate login script like
~/.profile
or~/.bashrc
.
Within scripts like library scripts, sometimes an alias for a function is needed, such as when a function is renamed but backward compatibility is required. This can be accomplished by creating a simple function with the old name that passes all its arguments to the
new function...
# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }
When to write a script ...
- Scripts assemble software components (aka. tools, commands, processes, executables, programs) into more complex components, which may themselves be assembled into still more complex components.
- Scripts are usually made executable so they can be called by name. When called, a new subprocess is spawned for the script to run in. Copies of any
export
ed variables and/or functions are passed by value to the script. Changes to those variables do not propagate back to the parent script. - Scripts may also be loaded(sourced) as if they were part of the calling script. This is analogous to what some other languages call "import" or "include". When sourced, they execute within the existing process. No subprocess is spawned.
When to write a function ...
- Functions are effectively pre-loaded shell scripts. They perform a bit better than calling a separate script, but only if it must be read from mechanical disk. Today's proliferation of flashdrives, SSDs and Linux's normal caching in unused RAM make that improvement largely unmeasurable.
- Functions serve as bash's principle means of achieving modularity, encapsulation and reuse. They improve the clarity, reliability and maintainability of scripts.
- The syntax rules for calling a function are identical to that of calling an executable. A function with the same name as an executable would be invoked instead of the executable.
- Functions are local to the script they are in.
- Functions may be exported (copied by value) so they can be used inside called scripts. Thus, functions only propagate to child processes, never parents.
- Functions create reusable commands that are often assembled into libraries (a script with only function definitions) to be sourced by other scripts.
When to write an alias ...
- Bash aliases don't work inside shell script constructs like if/then and for/do loops, so should only be used as keyboard shortcuts on an interactive commandline. Thus, all alias definitions usually reside inside the appropriate login script like
~/.profile
or~/.bashrc
.
Within scripts like library scripts, sometimes an alias for a function is needed, such as when a function is renamed but backward compatibility is required. This can be accomplished by creating a simple function with the old name that passes all its arguments to the
new function...
# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }
edited Nov 5 '18 at 21:57
answered Feb 6 '14 at 11:29
DocSalvagerDocSalvager
1,3612 gold badges17 silver badges34 bronze badges
1,3612 gold badges17 silver badges34 bronze badges
add a comment
|
add a comment
|
One other thing that I don't believe has been brought up: a function executes in the context of the invoking process, whereas a script forks a new shell.
This could be important for performance -- a function is faster, since it doesn't fork()
and exec()
. In normal circumstances, the difference is trivial, but if you are debugging a system that is out of memory and is page-thrashing, it could make a big difference.
Also, if you want to modify your current shell environment, you should use a function. For example, a function could change the command lookup $PATH
for the current shell, but a script cannot, because it operates on a fork/exec copy of $PATH
.
How does this propagation of functions to children work?
– HappyFace
Dec 16 '18 at 21:27
1
@HappyFace In Bash you canexport -f
a function, though the precise inner workings of this are somewhat obscure. This is not portable to traditional Bourne shell I believe.
– tripleee
Aug 5 at 16:53
add a comment
|
One other thing that I don't believe has been brought up: a function executes in the context of the invoking process, whereas a script forks a new shell.
This could be important for performance -- a function is faster, since it doesn't fork()
and exec()
. In normal circumstances, the difference is trivial, but if you are debugging a system that is out of memory and is page-thrashing, it could make a big difference.
Also, if you want to modify your current shell environment, you should use a function. For example, a function could change the command lookup $PATH
for the current shell, but a script cannot, because it operates on a fork/exec copy of $PATH
.
How does this propagation of functions to children work?
– HappyFace
Dec 16 '18 at 21:27
1
@HappyFace In Bash you canexport -f
a function, though the precise inner workings of this are somewhat obscure. This is not portable to traditional Bourne shell I believe.
– tripleee
Aug 5 at 16:53
add a comment
|
One other thing that I don't believe has been brought up: a function executes in the context of the invoking process, whereas a script forks a new shell.
This could be important for performance -- a function is faster, since it doesn't fork()
and exec()
. In normal circumstances, the difference is trivial, but if you are debugging a system that is out of memory and is page-thrashing, it could make a big difference.
Also, if you want to modify your current shell environment, you should use a function. For example, a function could change the command lookup $PATH
for the current shell, but a script cannot, because it operates on a fork/exec copy of $PATH
.
One other thing that I don't believe has been brought up: a function executes in the context of the invoking process, whereas a script forks a new shell.
This could be important for performance -- a function is faster, since it doesn't fork()
and exec()
. In normal circumstances, the difference is trivial, but if you are debugging a system that is out of memory and is page-thrashing, it could make a big difference.
Also, if you want to modify your current shell environment, you should use a function. For example, a function could change the command lookup $PATH
for the current shell, but a script cannot, because it operates on a fork/exec copy of $PATH
.
edited Aug 19 '18 at 8:12
tripleee
5,5371 gold badge22 silver badges33 bronze badges
5,5371 gold badge22 silver badges33 bronze badges
answered Feb 8 '12 at 19:22
Jan SteinmanJan Steinman
1411 bronze badge
1411 bronze badge
How does this propagation of functions to children work?
– HappyFace
Dec 16 '18 at 21:27
1
@HappyFace In Bash you canexport -f
a function, though the precise inner workings of this are somewhat obscure. This is not portable to traditional Bourne shell I believe.
– tripleee
Aug 5 at 16:53
add a comment
|
How does this propagation of functions to children work?
– HappyFace
Dec 16 '18 at 21:27
1
@HappyFace In Bash you canexport -f
a function, though the precise inner workings of this are somewhat obscure. This is not portable to traditional Bourne shell I believe.
– tripleee
Aug 5 at 16:53
How does this propagation of functions to children work?
– HappyFace
Dec 16 '18 at 21:27
How does this propagation of functions to children work?
– HappyFace
Dec 16 '18 at 21:27
1
1
@HappyFace In Bash you can
export -f
a function, though the precise inner workings of this are somewhat obscure. This is not portable to traditional Bourne shell I believe.– tripleee
Aug 5 at 16:53
@HappyFace In Bash you can
export -f
a function, though the precise inner workings of this are somewhat obscure. This is not portable to traditional Bourne shell I believe.– tripleee
Aug 5 at 16:53
add a comment
|
Script and alias and script and function aren't mutually exclusive. You can and do store aliases and functions in scripts.
Scripts are just code which is made persistent. Useful functions and aliases which you like to use in the future are stored in scripts. However, a script is often a collection of more than one function.
Since aliases aren't parameterized, they are very limited; usually to define some default parameters.
A function is a separate unit of code, a well-defined concept of a few lines of code which can't separated into smaller, useful parts; one which can be reused directly or other by other functions.
add a comment
|
Script and alias and script and function aren't mutually exclusive. You can and do store aliases and functions in scripts.
Scripts are just code which is made persistent. Useful functions and aliases which you like to use in the future are stored in scripts. However, a script is often a collection of more than one function.
Since aliases aren't parameterized, they are very limited; usually to define some default parameters.
A function is a separate unit of code, a well-defined concept of a few lines of code which can't separated into smaller, useful parts; one which can be reused directly or other by other functions.
add a comment
|
Script and alias and script and function aren't mutually exclusive. You can and do store aliases and functions in scripts.
Scripts are just code which is made persistent. Useful functions and aliases which you like to use in the future are stored in scripts. However, a script is often a collection of more than one function.
Since aliases aren't parameterized, they are very limited; usually to define some default parameters.
A function is a separate unit of code, a well-defined concept of a few lines of code which can't separated into smaller, useful parts; one which can be reused directly or other by other functions.
Script and alias and script and function aren't mutually exclusive. You can and do store aliases and functions in scripts.
Scripts are just code which is made persistent. Useful functions and aliases which you like to use in the future are stored in scripts. However, a script is often a collection of more than one function.
Since aliases aren't parameterized, they are very limited; usually to define some default parameters.
A function is a separate unit of code, a well-defined concept of a few lines of code which can't separated into smaller, useful parts; one which can be reused directly or other by other functions.
edited Jan 26 '18 at 1:40


Jeff Schaller♦
50.2k11 gold badges74 silver badges167 bronze badges
50.2k11 gold badges74 silver badges167 bronze badges
answered Feb 6 '12 at 10:26
user unknownuser unknown
7,8221 gold badge25 silver badges52 bronze badges
7,8221 gold badge25 silver badges52 bronze badges
add a comment
|
add a comment
|
If it should be very fast, make it an alias or a function.
If it should be usable outside your preferred shell, make it a script.1
If it takes arguments, make it a function or a script.
If it needs to contain special characters, make it an alias or a script.2
If it needs to work with sudo, make it an alias or a script.3
If you want to change it easily without logging out and in, a script is easier.4
Footnotes
1 Or make it an alias, put it in ~/.env
and set export ENV="$HOME/.env"
, but it's complicated to make it work portably.
2 Function names must be identifiers, so they must start with a letter, and may only contain letters, digits, and underscores. For example, I have an alias alias +='pushd +1'
. It can't be a function.
3 And add the alias alias sudo='sudo '
. Ditto any other command such as strace
, gdb
, etc. that takes a command as its first argument.
4 See also: fpath. Of course you can also do source ~/.bashrc
or similar, but this often has other side effects.
1
I didn't know you could alias+
in bash. Interestingly, after testing I discovered that in bash you can make+
an alias but not a function, as you say, but zsh is the reverse -+
can be a function but not an alias.
– Kevin
May 9 '12 at 18:42
Inzsh
you have to writealias -- +='some command here'
.
– Mikel
May 10 '12 at 1:07
Somehow, I don't think aliasing+
is portable. See the POSIX spec on Alias Names
– jw013
Aug 23 '12 at 18:08
3
Upvote for coveringsudo
usage. Regarding footnote 4, I store my aliases in~/.bash_aliases
and function definitions in~/.bash_functions
so I can easily resource
them (without any danger of side effects).
– Anthony Geoghegan
Nov 19 '15 at 11:15
add a comment
|
If it should be very fast, make it an alias or a function.
If it should be usable outside your preferred shell, make it a script.1
If it takes arguments, make it a function or a script.
If it needs to contain special characters, make it an alias or a script.2
If it needs to work with sudo, make it an alias or a script.3
If you want to change it easily without logging out and in, a script is easier.4
Footnotes
1 Or make it an alias, put it in ~/.env
and set export ENV="$HOME/.env"
, but it's complicated to make it work portably.
2 Function names must be identifiers, so they must start with a letter, and may only contain letters, digits, and underscores. For example, I have an alias alias +='pushd +1'
. It can't be a function.
3 And add the alias alias sudo='sudo '
. Ditto any other command such as strace
, gdb
, etc. that takes a command as its first argument.
4 See also: fpath. Of course you can also do source ~/.bashrc
or similar, but this often has other side effects.
1
I didn't know you could alias+
in bash. Interestingly, after testing I discovered that in bash you can make+
an alias but not a function, as you say, but zsh is the reverse -+
can be a function but not an alias.
– Kevin
May 9 '12 at 18:42
Inzsh
you have to writealias -- +='some command here'
.
– Mikel
May 10 '12 at 1:07
Somehow, I don't think aliasing+
is portable. See the POSIX spec on Alias Names
– jw013
Aug 23 '12 at 18:08
3
Upvote for coveringsudo
usage. Regarding footnote 4, I store my aliases in~/.bash_aliases
and function definitions in~/.bash_functions
so I can easily resource
them (without any danger of side effects).
– Anthony Geoghegan
Nov 19 '15 at 11:15
add a comment
|
If it should be very fast, make it an alias or a function.
If it should be usable outside your preferred shell, make it a script.1
If it takes arguments, make it a function or a script.
If it needs to contain special characters, make it an alias or a script.2
If it needs to work with sudo, make it an alias or a script.3
If you want to change it easily without logging out and in, a script is easier.4
Footnotes
1 Or make it an alias, put it in ~/.env
and set export ENV="$HOME/.env"
, but it's complicated to make it work portably.
2 Function names must be identifiers, so they must start with a letter, and may only contain letters, digits, and underscores. For example, I have an alias alias +='pushd +1'
. It can't be a function.
3 And add the alias alias sudo='sudo '
. Ditto any other command such as strace
, gdb
, etc. that takes a command as its first argument.
4 See also: fpath. Of course you can also do source ~/.bashrc
or similar, but this often has other side effects.
If it should be very fast, make it an alias or a function.
If it should be usable outside your preferred shell, make it a script.1
If it takes arguments, make it a function or a script.
If it needs to contain special characters, make it an alias or a script.2
If it needs to work with sudo, make it an alias or a script.3
If you want to change it easily without logging out and in, a script is easier.4
Footnotes
1 Or make it an alias, put it in ~/.env
and set export ENV="$HOME/.env"
, but it's complicated to make it work portably.
2 Function names must be identifiers, so they must start with a letter, and may only contain letters, digits, and underscores. For example, I have an alias alias +='pushd +1'
. It can't be a function.
3 And add the alias alias sudo='sudo '
. Ditto any other command such as strace
, gdb
, etc. that takes a command as its first argument.
4 See also: fpath. Of course you can also do source ~/.bashrc
or similar, but this often has other side effects.
edited May 9 '12 at 15:50
answered May 9 '12 at 15:44
MikelMikel
42.4k10 gold badges107 silver badges129 bronze badges
42.4k10 gold badges107 silver badges129 bronze badges
1
I didn't know you could alias+
in bash. Interestingly, after testing I discovered that in bash you can make+
an alias but not a function, as you say, but zsh is the reverse -+
can be a function but not an alias.
– Kevin
May 9 '12 at 18:42
Inzsh
you have to writealias -- +='some command here'
.
– Mikel
May 10 '12 at 1:07
Somehow, I don't think aliasing+
is portable. See the POSIX spec on Alias Names
– jw013
Aug 23 '12 at 18:08
3
Upvote for coveringsudo
usage. Regarding footnote 4, I store my aliases in~/.bash_aliases
and function definitions in~/.bash_functions
so I can easily resource
them (without any danger of side effects).
– Anthony Geoghegan
Nov 19 '15 at 11:15
add a comment
|
1
I didn't know you could alias+
in bash. Interestingly, after testing I discovered that in bash you can make+
an alias but not a function, as you say, but zsh is the reverse -+
can be a function but not an alias.
– Kevin
May 9 '12 at 18:42
Inzsh
you have to writealias -- +='some command here'
.
– Mikel
May 10 '12 at 1:07
Somehow, I don't think aliasing+
is portable. See the POSIX spec on Alias Names
– jw013
Aug 23 '12 at 18:08
3
Upvote for coveringsudo
usage. Regarding footnote 4, I store my aliases in~/.bash_aliases
and function definitions in~/.bash_functions
so I can easily resource
them (without any danger of side effects).
– Anthony Geoghegan
Nov 19 '15 at 11:15
1
1
I didn't know you could alias
+
in bash. Interestingly, after testing I discovered that in bash you can make +
an alias but not a function, as you say, but zsh is the reverse - +
can be a function but not an alias.– Kevin
May 9 '12 at 18:42
I didn't know you could alias
+
in bash. Interestingly, after testing I discovered that in bash you can make +
an alias but not a function, as you say, but zsh is the reverse - +
can be a function but not an alias.– Kevin
May 9 '12 at 18:42
In
zsh
you have to write alias -- +='some command here'
.– Mikel
May 10 '12 at 1:07
In
zsh
you have to write alias -- +='some command here'
.– Mikel
May 10 '12 at 1:07
Somehow, I don't think aliasing
+
is portable. See the POSIX spec on Alias Names– jw013
Aug 23 '12 at 18:08
Somehow, I don't think aliasing
+
is portable. See the POSIX spec on Alias Names– jw013
Aug 23 '12 at 18:08
3
3
Upvote for covering
sudo
usage. Regarding footnote 4, I store my aliases in ~/.bash_aliases
and function definitions in ~/.bash_functions
so I can easily resource
them (without any danger of side effects).– Anthony Geoghegan
Nov 19 '15 at 11:15
Upvote for covering
sudo
usage. Regarding footnote 4, I store my aliases in ~/.bash_aliases
and function definitions in ~/.bash_functions
so I can easily resource
them (without any danger of side effects).– Anthony Geoghegan
Nov 19 '15 at 11:15
add a comment
|
Just to add a few notes:
- Only separate script can be used with sudo (like if you need to edit a system file), for example:
sudo v /etc/rc.conf #where v runs vim in a new terminal window;
- Only aliases or functions could replace system commands under same name (assuming that you add your scripts dir to the end of PATH, which I think is advisable for safety in case of accidental or malevolent creating of script with name identical to a system command), for example:
alias ls='ls --color=auto' #enable colored output;
- Aliases and functions take less memory and time for execution, but take time to load (since shell has to interpret them all before showing you prompt). Take this into account if you run new shell processes regularily, for example:
# pressing key to open new terminal
# waiting for a few seconds before shell prompt finally appears.
Other than that, you could use the simplest form possible, i.e. first consider alias, then function, then script.
5
Aliases can also be used withsudo
. But first you needalias sudo='sudo '
.
– Mikel
May 9 '12 at 15:32
While it is true that executing a script will momentarily consume more memory for the duration of the fork+exec, having a lot of code loaded into the memory of the current shell instance makes it consume more memory going forward, often to store code which only gets used fairly rarely.
– tripleee
Aug 19 '18 at 8:17
add a comment
|
Just to add a few notes:
- Only separate script can be used with sudo (like if you need to edit a system file), for example:
sudo v /etc/rc.conf #where v runs vim in a new terminal window;
- Only aliases or functions could replace system commands under same name (assuming that you add your scripts dir to the end of PATH, which I think is advisable for safety in case of accidental or malevolent creating of script with name identical to a system command), for example:
alias ls='ls --color=auto' #enable colored output;
- Aliases and functions take less memory and time for execution, but take time to load (since shell has to interpret them all before showing you prompt). Take this into account if you run new shell processes regularily, for example:
# pressing key to open new terminal
# waiting for a few seconds before shell prompt finally appears.
Other than that, you could use the simplest form possible, i.e. first consider alias, then function, then script.
5
Aliases can also be used withsudo
. But first you needalias sudo='sudo '
.
– Mikel
May 9 '12 at 15:32
While it is true that executing a script will momentarily consume more memory for the duration of the fork+exec, having a lot of code loaded into the memory of the current shell instance makes it consume more memory going forward, often to store code which only gets used fairly rarely.
– tripleee
Aug 19 '18 at 8:17
add a comment
|
Just to add a few notes:
- Only separate script can be used with sudo (like if you need to edit a system file), for example:
sudo v /etc/rc.conf #where v runs vim in a new terminal window;
- Only aliases or functions could replace system commands under same name (assuming that you add your scripts dir to the end of PATH, which I think is advisable for safety in case of accidental or malevolent creating of script with name identical to a system command), for example:
alias ls='ls --color=auto' #enable colored output;
- Aliases and functions take less memory and time for execution, but take time to load (since shell has to interpret them all before showing you prompt). Take this into account if you run new shell processes regularily, for example:
# pressing key to open new terminal
# waiting for a few seconds before shell prompt finally appears.
Other than that, you could use the simplest form possible, i.e. first consider alias, then function, then script.
Just to add a few notes:
- Only separate script can be used with sudo (like if you need to edit a system file), for example:
sudo v /etc/rc.conf #where v runs vim in a new terminal window;
- Only aliases or functions could replace system commands under same name (assuming that you add your scripts dir to the end of PATH, which I think is advisable for safety in case of accidental or malevolent creating of script with name identical to a system command), for example:
alias ls='ls --color=auto' #enable colored output;
- Aliases and functions take less memory and time for execution, but take time to load (since shell has to interpret them all before showing you prompt). Take this into account if you run new shell processes regularily, for example:
# pressing key to open new terminal
# waiting for a few seconds before shell prompt finally appears.
Other than that, you could use the simplest form possible, i.e. first consider alias, then function, then script.
answered Feb 10 '12 at 16:37
corvinuscorvinus
1462 bronze badges
1462 bronze badges
5
Aliases can also be used withsudo
. But first you needalias sudo='sudo '
.
– Mikel
May 9 '12 at 15:32
While it is true that executing a script will momentarily consume more memory for the duration of the fork+exec, having a lot of code loaded into the memory of the current shell instance makes it consume more memory going forward, often to store code which only gets used fairly rarely.
– tripleee
Aug 19 '18 at 8:17
add a comment
|
5
Aliases can also be used withsudo
. But first you needalias sudo='sudo '
.
– Mikel
May 9 '12 at 15:32
While it is true that executing a script will momentarily consume more memory for the duration of the fork+exec, having a lot of code loaded into the memory of the current shell instance makes it consume more memory going forward, often to store code which only gets used fairly rarely.
– tripleee
Aug 19 '18 at 8:17
5
5
Aliases can also be used with
sudo
. But first you need alias sudo='sudo '
.– Mikel
May 9 '12 at 15:32
Aliases can also be used with
sudo
. But first you need alias sudo='sudo '
.– Mikel
May 9 '12 at 15:32
While it is true that executing a script will momentarily consume more memory for the duration of the fork+exec, having a lot of code loaded into the memory of the current shell instance makes it consume more memory going forward, often to store code which only gets used fairly rarely.
– tripleee
Aug 19 '18 at 8:17
While it is true that executing a script will momentarily consume more memory for the duration of the fork+exec, having a lot of code loaded into the memory of the current shell instance makes it consume more memory going forward, often to store code which only gets used fairly rarely.
– tripleee
Aug 19 '18 at 8:17
add a comment
|
My rule of thumb is:
- aliases - one command, no parameters
- functions - one command some parameters
- script - several commands, no parameters
add a comment
|
My rule of thumb is:
- aliases - one command, no parameters
- functions - one command some parameters
- script - several commands, no parameters
add a comment
|
My rule of thumb is:
- aliases - one command, no parameters
- functions - one command some parameters
- script - several commands, no parameters
My rule of thumb is:
- aliases - one command, no parameters
- functions - one command some parameters
- script - several commands, no parameters
answered Dec 10 '15 at 2:00
Michael DurrantMichael Durrant
17.7k51 gold badges127 silver badges197 bronze badges
17.7k51 gold badges127 silver badges197 bronze badges
add a comment
|
add a comment
|
In a multi user ( or multi sysamin ) environment, I use scripts for everything, even if it just ends up being a short 'exec something....' wrapper.
Sure, it's technically slower/less efficient than an alias or function, but that almost never matters - and provided it's in the path, a script always works.
Your feature might be called from cron, from something with a reduced or modified environment like sudo or env, or the user may just be using a different shell to you - all or which is likely to break an alias or function.
If you have something performance sensitive, handle that as a special case, or better yet, consider that a trigger to rewrite in a more functional scripting language.
If we're talking about features that will only be used in other scripts, then you can also consider defining a standard shell, and writing a function library script that can just be . sourced I to all other scripts.
T
add a comment
|
In a multi user ( or multi sysamin ) environment, I use scripts for everything, even if it just ends up being a short 'exec something....' wrapper.
Sure, it's technically slower/less efficient than an alias or function, but that almost never matters - and provided it's in the path, a script always works.
Your feature might be called from cron, from something with a reduced or modified environment like sudo or env, or the user may just be using a different shell to you - all or which is likely to break an alias or function.
If you have something performance sensitive, handle that as a special case, or better yet, consider that a trigger to rewrite in a more functional scripting language.
If we're talking about features that will only be used in other scripts, then you can also consider defining a standard shell, and writing a function library script that can just be . sourced I to all other scripts.
T
add a comment
|
In a multi user ( or multi sysamin ) environment, I use scripts for everything, even if it just ends up being a short 'exec something....' wrapper.
Sure, it's technically slower/less efficient than an alias or function, but that almost never matters - and provided it's in the path, a script always works.
Your feature might be called from cron, from something with a reduced or modified environment like sudo or env, or the user may just be using a different shell to you - all or which is likely to break an alias or function.
If you have something performance sensitive, handle that as a special case, or better yet, consider that a trigger to rewrite in a more functional scripting language.
If we're talking about features that will only be used in other scripts, then you can also consider defining a standard shell, and writing a function library script that can just be . sourced I to all other scripts.
T
In a multi user ( or multi sysamin ) environment, I use scripts for everything, even if it just ends up being a short 'exec something....' wrapper.
Sure, it's technically slower/less efficient than an alias or function, but that almost never matters - and provided it's in the path, a script always works.
Your feature might be called from cron, from something with a reduced or modified environment like sudo or env, or the user may just be using a different shell to you - all or which is likely to break an alias or function.
If you have something performance sensitive, handle that as a special case, or better yet, consider that a trigger to rewrite in a more functional scripting language.
If we're talking about features that will only be used in other scripts, then you can also consider defining a standard shell, and writing a function library script that can just be . sourced I to all other scripts.
T
answered Jan 6 '16 at 18:39
tjb63tjb63
711 silver badge1 bronze badge
711 silver badge1 bronze badge
add a comment
|
add a comment
|
An Example for a Situation Where you Most Likely Would Like to use an Alias.
I know this is an old post but I would like to point out a situation where I almost had to use a combination of alias with a script and I chose not to use a function.
I have a script in ~/.bin/
called setup
that does the following:1
- brings me to a certain directory.
- defines a few variables.
- prints messages about the state of the directory.2
The point is that if I would just run setup <project-name>
I wouldn't have those variables defined and I wouldn't have gotten to the directory at all. The solution I found to be the best was to add this script to PATH
and add alias setup=". ~/.bin/setup"
to ~/.bashrc
or whatever.
Notes:
- I used a script for this task and not a function not because it's particularly long but because I can edit it and I don't have to source the file after an edit if I want to refresh it's usage.
- A similar case accoured to me when I created a script to reload all my dotfiles.3
The script is available in my dotfiles repository under.bin/
.
About the script: I give this script an argument which is a name for the project I defined in advanced. Afterwards the script knows to bring to me to the right directory according to a certaincsv
file. The variables it defines are taken from the makefile in that directory. The script runs afterwardsls -l
andgit status
to show me what's going on there.
- That script is also available in my dotfiles repository under
.bin/
as well.
1
Hm, seems that should just be a function, not an alias-script combination. (BTW, environments is spelled "environments" not "enviorments.")
– Wildcard
Apr 25 '16 at 19:57
Thanks for commenting about the typo, I shall fix it on the next commit. As for using a function instead of a script - perhaps I'll use a function for this particular task and drop these aliases. The point is that sometimes it's quite easy to use a script and an alias if you edit that script from time to time.
– Doron Behar
Apr 25 '16 at 22:46
add a comment
|
An Example for a Situation Where you Most Likely Would Like to use an Alias.
I know this is an old post but I would like to point out a situation where I almost had to use a combination of alias with a script and I chose not to use a function.
I have a script in ~/.bin/
called setup
that does the following:1
- brings me to a certain directory.
- defines a few variables.
- prints messages about the state of the directory.2
The point is that if I would just run setup <project-name>
I wouldn't have those variables defined and I wouldn't have gotten to the directory at all. The solution I found to be the best was to add this script to PATH
and add alias setup=". ~/.bin/setup"
to ~/.bashrc
or whatever.
Notes:
- I used a script for this task and not a function not because it's particularly long but because I can edit it and I don't have to source the file after an edit if I want to refresh it's usage.
- A similar case accoured to me when I created a script to reload all my dotfiles.3
The script is available in my dotfiles repository under.bin/
.
About the script: I give this script an argument which is a name for the project I defined in advanced. Afterwards the script knows to bring to me to the right directory according to a certaincsv
file. The variables it defines are taken from the makefile in that directory. The script runs afterwardsls -l
andgit status
to show me what's going on there.
- That script is also available in my dotfiles repository under
.bin/
as well.
1
Hm, seems that should just be a function, not an alias-script combination. (BTW, environments is spelled "environments" not "enviorments.")
– Wildcard
Apr 25 '16 at 19:57
Thanks for commenting about the typo, I shall fix it on the next commit. As for using a function instead of a script - perhaps I'll use a function for this particular task and drop these aliases. The point is that sometimes it's quite easy to use a script and an alias if you edit that script from time to time.
– Doron Behar
Apr 25 '16 at 22:46
add a comment
|
An Example for a Situation Where you Most Likely Would Like to use an Alias.
I know this is an old post but I would like to point out a situation where I almost had to use a combination of alias with a script and I chose not to use a function.
I have a script in ~/.bin/
called setup
that does the following:1
- brings me to a certain directory.
- defines a few variables.
- prints messages about the state of the directory.2
The point is that if I would just run setup <project-name>
I wouldn't have those variables defined and I wouldn't have gotten to the directory at all. The solution I found to be the best was to add this script to PATH
and add alias setup=". ~/.bin/setup"
to ~/.bashrc
or whatever.
Notes:
- I used a script for this task and not a function not because it's particularly long but because I can edit it and I don't have to source the file after an edit if I want to refresh it's usage.
- A similar case accoured to me when I created a script to reload all my dotfiles.3
The script is available in my dotfiles repository under.bin/
.
About the script: I give this script an argument which is a name for the project I defined in advanced. Afterwards the script knows to bring to me to the right directory according to a certaincsv
file. The variables it defines are taken from the makefile in that directory. The script runs afterwardsls -l
andgit status
to show me what's going on there.
- That script is also available in my dotfiles repository under
.bin/
as well.
An Example for a Situation Where you Most Likely Would Like to use an Alias.
I know this is an old post but I would like to point out a situation where I almost had to use a combination of alias with a script and I chose not to use a function.
I have a script in ~/.bin/
called setup
that does the following:1
- brings me to a certain directory.
- defines a few variables.
- prints messages about the state of the directory.2
The point is that if I would just run setup <project-name>
I wouldn't have those variables defined and I wouldn't have gotten to the directory at all. The solution I found to be the best was to add this script to PATH
and add alias setup=". ~/.bin/setup"
to ~/.bashrc
or whatever.
Notes:
- I used a script for this task and not a function not because it's particularly long but because I can edit it and I don't have to source the file after an edit if I want to refresh it's usage.
- A similar case accoured to me when I created a script to reload all my dotfiles.3
The script is available in my dotfiles repository under.bin/
.
About the script: I give this script an argument which is a name for the project I defined in advanced. Afterwards the script knows to bring to me to the right directory according to a certaincsv
file. The variables it defines are taken from the makefile in that directory. The script runs afterwardsls -l
andgit status
to show me what's going on there.
- That script is also available in my dotfiles repository under
.bin/
as well.
answered Apr 25 '16 at 19:32
Doron BeharDoron Behar
2191 silver badge12 bronze badges
2191 silver badge12 bronze badges
1
Hm, seems that should just be a function, not an alias-script combination. (BTW, environments is spelled "environments" not "enviorments.")
– Wildcard
Apr 25 '16 at 19:57
Thanks for commenting about the typo, I shall fix it on the next commit. As for using a function instead of a script - perhaps I'll use a function for this particular task and drop these aliases. The point is that sometimes it's quite easy to use a script and an alias if you edit that script from time to time.
– Doron Behar
Apr 25 '16 at 22:46
add a comment
|
1
Hm, seems that should just be a function, not an alias-script combination. (BTW, environments is spelled "environments" not "enviorments.")
– Wildcard
Apr 25 '16 at 19:57
Thanks for commenting about the typo, I shall fix it on the next commit. As for using a function instead of a script - perhaps I'll use a function for this particular task and drop these aliases. The point is that sometimes it's quite easy to use a script and an alias if you edit that script from time to time.
– Doron Behar
Apr 25 '16 at 22:46
1
1
Hm, seems that should just be a function, not an alias-script combination. (BTW, environments is spelled "environments" not "enviorments.")
– Wildcard
Apr 25 '16 at 19:57
Hm, seems that should just be a function, not an alias-script combination. (BTW, environments is spelled "environments" not "enviorments.")
– Wildcard
Apr 25 '16 at 19:57
Thanks for commenting about the typo, I shall fix it on the next commit. As for using a function instead of a script - perhaps I'll use a function for this particular task and drop these aliases. The point is that sometimes it's quite easy to use a script and an alias if you edit that script from time to time.
– Doron Behar
Apr 25 '16 at 22:46
Thanks for commenting about the typo, I shall fix it on the next commit. As for using a function instead of a script - perhaps I'll use a function for this particular task and drop these aliases. The point is that sometimes it's quite easy to use a script and an alias if you edit that script from time to time.
– Doron Behar
Apr 25 '16 at 22:46
add a comment
|
When to write a script
When you might want to run the command from a tool other than the shell.
This includes vim (for me): having written filters and other programs as scripts, I can do something like :%!my-filter
to filter a file through the program from my editor.
If my-filter
were a function or alias, that would not be possible.
add a comment
|
When to write a script
When you might want to run the command from a tool other than the shell.
This includes vim (for me): having written filters and other programs as scripts, I can do something like :%!my-filter
to filter a file through the program from my editor.
If my-filter
were a function or alias, that would not be possible.
add a comment
|
When to write a script
When you might want to run the command from a tool other than the shell.
This includes vim (for me): having written filters and other programs as scripts, I can do something like :%!my-filter
to filter a file through the program from my editor.
If my-filter
were a function or alias, that would not be possible.
When to write a script
When you might want to run the command from a tool other than the shell.
This includes vim (for me): having written filters and other programs as scripts, I can do something like :%!my-filter
to filter a file through the program from my editor.
If my-filter
were a function or alias, that would not be possible.
answered 2 hours ago


D. Ben KnobleD. Ben Knoble
1931 silver badge7 bronze badges
1931 silver badge7 bronze badges
add a comment
|
add a comment
|
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f30925%2fin-bash-when-to-alias-when-to-script-and-when-to-write-a-function%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
5
possible duplicate of bash functions vs scripts
– Gilles
Feb 5 '12 at 22:35
10
+1 for the stating explicitly all the subsets of {alias, script, function} at which this question does not aim. +1 for the childlike faith that it was OK for you to omit the null subset.
– Thomas L Holaday
Aug 26 '13 at 15:16
1
Although the question specifically asked about bash, note that older Bourne shells had 'alias' but not functions. This might make a difference if you're worried about compatibility.
– AndyB
Mar 4 '16 at 5:53
If .bashrc really the best place, or at least a solid place, for this? There are so many ways to do the same thing in Linux, which I appreciate, however, all things being equal, I prefer to do things the most common way.
– Kit10
Jun 10 '16 at 13:33