In Bash, when to alias, when to script, and when to write a function? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern) 2019 Community Moderator Election Results Why I closed the “Why is Kali so hard” questionHow 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.shortcut for commandsHow do I decide whether to make a command a shell script or an alias?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 definitionBash (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?

How much damage would a cupful of neutron star matter do to the Earth?

How to install press fit bottom bracket into new frame

How come Sam didn't become Lord of Horn Hill?

Is it possible for SQL statements to execute concurrently within a single session in SQL Server?

AppleTVs create a chatty alternate WiFi network

Is there any word for a place full of confusion?

Morning, Afternoon, Night Kanji

An adverb for when you're not exaggerating

Why does it sometimes sound good to play a grace note as a lead in to a note in a melody?

Project Euler #1 in C++

Most bit efficient text communication method?

How do living politicians protect their readily obtainable signatures from misuse?

Why should I vote and accept answers?

Performance gap between vector<bool> and array

Should I use a zero-interest credit card for a large one-time purchase?

Taylor expansion of ln(1-x)

How to write this math term? with cases it isn't working

Why is Nikon 1.4g better when Nikon 1.8g is sharper?

How would a mousetrap for use in space work?

How can I reduce the gap between left and right of cdot with a macro?

Can a new player join a group only when a new campaign starts?

Converted a Scalar function to a TVF function for parallel execution-Still running in Serial mode

Why wasn't DOSKEY integrated with COMMAND.COM?

Time to Settle Down!



In Bash, when to alias, when to script, and when to write a function?



Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern)
2019 Community Moderator Election Results
Why I closed the “Why is Kali so hard” questionHow 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.shortcut for commandsHow do I decide whether to make a command a shell script or an alias?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 definitionBash (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;








347















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.










share|improve this question



















  • 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











  • 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

















347















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.










share|improve this question



















  • 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











  • 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













347












347








347


214






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.










share|improve this question
















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Apr 25 '16 at 20:01









Wildcard

23.4k1067172




23.4k1067172










asked Feb 5 '12 at 13:12









ixtmixilixixtmixilix

5,6211959101




5,6211959101







  • 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











  • 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





    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











  • 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













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










14 Answers
14






active

oldest

votes


















235














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.






share|improve this answer




















  • 12





    Take a look at my answer as well for more concrete differences between functions and scripts. Basically, functions and aliases are for frequently used simple things that you want to be stored in memory, while scripts are for more rarely used commands that you don't mind reading from disk every time. Whether or not a new forked process is needed also makes a slight difference if you run a command several thousand times in a for loop.

    – jw013
    Feb 7 '12 at 0:55






  • 10





    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



















248














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.






share|improve this answer




















  • 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






  • 2





    @mikeserv - Perhaps you should write a blog post about those facts and variations. But it would be in an advanced bash scripting category, not this answer's basic guidelines category.

    – Jesse Chisholm
    Nov 10 '15 at 21:44






  • 3





    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






  • 2





    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


















34














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.






share|improve this answer


















  • 5





    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






  • 6





    ... or if you need the side-effects to alter the current shell.

    – glenn jackman
    Jul 27 '15 at 16:30


















14














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.






share|improve this answer























  • 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











  • @tripleee The meaning was more like "you can't exec() shell functions" :-)

    – nohillside
    Sep 17 '18 at 8:50


















9














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 exported 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 "$@";





share|improve this answer
































    8














    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.






    share|improve this answer

























    • How does this propagation of functions to children work?

      – HappyFace
      Dec 16 '18 at 21:27


















    6














    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.






    share|improve this answer






























      6














      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.






      share|improve this answer
































        4














        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.






        share|improve this answer




















        • 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











        • 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







        • 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


















        3














        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.






        share|improve this answer


















        • 5





          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


















        2














        My rule of thumb is:



        • aliases - one command, no parameters

        • functions - one command some parameters

        • script - several commands, no parameters





        share|improve this answer






























          1














          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






          share|improve this answer






























            0














            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



            1. brings me to a certain directory.

            2. defines a few variables.

            3. 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:



            1. 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.

            2. A similar case accoured to me when I created a script to reload all my dotfiles.3



            1. The script is available in my dotfiles repository under .bin/.


            2. 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 certain csv file. The variables it defines are taken from the makefile in that directory. The script runs afterwards ls -l and git status to show me what's going on there.

            3. That script is also available in my dotfiles repository under .bin/ as well.






            share|improve this answer


















            • 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


















            -8














            1. alias for single line text replacement

            2. scripts for anything more.





            share|improve this answer

























              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/3.0/"u003ecc by-sa 3.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
              );



              );













              draft saved

              draft discarded


















              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









              235














              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.






              share|improve this answer




















              • 12





                Take a look at my answer as well for more concrete differences between functions and scripts. Basically, functions and aliases are for frequently used simple things that you want to be stored in memory, while scripts are for more rarely used commands that you don't mind reading from disk every time. Whether or not a new forked process is needed also makes a slight difference if you run a command several thousand times in a for loop.

                – jw013
                Feb 7 '12 at 0:55






              • 10





                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
















              235














              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.






              share|improve this answer




















              • 12





                Take a look at my answer as well for more concrete differences between functions and scripts. Basically, functions and aliases are for frequently used simple things that you want to be stored in memory, while scripts are for more rarely used commands that you don't mind reading from disk every time. Whether or not a new forked process is needed also makes a slight difference if you run a command several thousand times in a for loop.

                – jw013
                Feb 7 '12 at 0:55






              • 10





                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














              235












              235








              235







              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.






              share|improve this answer















              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.







              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited Apr 13 '17 at 12:37









              Community

              1




              1










              answered Feb 5 '12 at 19:00









              KevinKevin

              27.9k1066103




              27.9k1066103







              • 12





                Take a look at my answer as well for more concrete differences between functions and scripts. Basically, functions and aliases are for frequently used simple things that you want to be stored in memory, while scripts are for more rarely used commands that you don't mind reading from disk every time. Whether or not a new forked process is needed also makes a slight difference if you run a command several thousand times in a for loop.

                – jw013
                Feb 7 '12 at 0:55






              • 10





                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













              • 12





                Take a look at my answer as well for more concrete differences between functions and scripts. Basically, functions and aliases are for frequently used simple things that you want to be stored in memory, while scripts are for more rarely used commands that you don't mind reading from disk every time. Whether or not a new forked process is needed also makes a slight difference if you run a command several thousand times in a for loop.

                – jw013
                Feb 7 '12 at 0:55






              • 10





                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








              12




              12





              Take a look at my answer as well for more concrete differences between functions and scripts. Basically, functions and aliases are for frequently used simple things that you want to be stored in memory, while scripts are for more rarely used commands that you don't mind reading from disk every time. Whether or not a new forked process is needed also makes a slight difference if you run a command several thousand times in a for loop.

              – jw013
              Feb 7 '12 at 0:55





              Take a look at my answer as well for more concrete differences between functions and scripts. Basically, functions and aliases are for frequently used simple things that you want to be stored in memory, while scripts are for more rarely used commands that you don't mind reading from disk every time. Whether or not a new forked process is needed also makes a slight difference if you run a command several thousand times in a for loop.

              – jw013
              Feb 7 '12 at 0:55




              10




              10





              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














              248














              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.






              share|improve this answer




















              • 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






              • 2





                @mikeserv - Perhaps you should write a blog post about those facts and variations. But it would be in an advanced bash scripting category, not this answer's basic guidelines category.

                – Jesse Chisholm
                Nov 10 '15 at 21:44






              • 3





                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






              • 2





                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















              248














              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.






              share|improve this answer




















              • 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






              • 2





                @mikeserv - Perhaps you should write a blog post about those facts and variations. But it would be in an advanced bash scripting category, not this answer's basic guidelines category.

                – Jesse Chisholm
                Nov 10 '15 at 21:44






              • 3





                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






              • 2





                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













              248












              248








              248







              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.






              share|improve this answer















              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.







              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited Sep 8 '12 at 0:52









              Robbie

              1032




              1032










              answered Feb 5 '12 at 21:49









              jw013jw013

              37k7102125




              37k7102125







              • 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






              • 2





                @mikeserv - Perhaps you should write a blog post about those facts and variations. But it would be in an advanced bash scripting category, not this answer's basic guidelines category.

                – Jesse Chisholm
                Nov 10 '15 at 21:44






              • 3





                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






              • 2





                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












              • 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






              • 2





                @mikeserv - Perhaps you should write a blog post about those facts and variations. But it would be in an advanced bash scripting category, not this answer's basic guidelines category.

                – Jesse Chisholm
                Nov 10 '15 at 21:44






              • 3





                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






              • 2





                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







              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




              2




              2





              @mikeserv - Perhaps you should write a blog post about those facts and variations. But it would be in an advanced bash scripting category, not this answer's basic guidelines category.

              – Jesse Chisholm
              Nov 10 '15 at 21:44





              @mikeserv - Perhaps you should write a blog post about those facts and variations. But it would be in an advanced bash scripting category, not this answer's basic guidelines category.

              – Jesse Chisholm
              Nov 10 '15 at 21:44




              3




              3





              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




              2




              2





              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











              34














              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.






              share|improve this answer


















              • 5





                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






              • 6





                ... or if you need the side-effects to alter the current shell.

                – glenn jackman
                Jul 27 '15 at 16:30















              34














              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.






              share|improve this answer


















              • 5





                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






              • 6





                ... or if you need the side-effects to alter the current shell.

                – glenn jackman
                Jul 27 '15 at 16:30













              34












              34








              34







              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.






              share|improve this answer













              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.







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Feb 5 '12 at 14:52









              phunehehephunehehe

              12.3k1882141




              12.3k1882141







              • 5





                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






              • 6





                ... or if you need the side-effects to alter the current shell.

                – glenn jackman
                Jul 27 '15 at 16:30












              • 5





                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






              • 6





                ... or if you need the side-effects to alter the current shell.

                – glenn jackman
                Jul 27 '15 at 16:30







              5




              5





              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




              6




              6





              ... 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











              14














              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.






              share|improve this answer























              • 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











              • @tripleee The meaning was more like "you can't exec() shell functions" :-)

                – nohillside
                Sep 17 '18 at 8:50















              14














              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.






              share|improve this answer























              • 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











              • @tripleee The meaning was more like "you can't exec() shell functions" :-)

                – nohillside
                Sep 17 '18 at 8:50













              14












              14








              14







              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.






              share|improve this answer













              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.







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Feb 5 '12 at 15:08









              nohillsidenohillside

              2,4351120




              2,4351120












              • 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











              • @tripleee The meaning was more like "you can't exec() shell functions" :-)

                – nohillside
                Sep 17 '18 at 8:50

















              • 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











              • @tripleee The meaning was more like "you can't exec() shell functions" :-)

                – nohillside
                Sep 17 '18 at 8:50
















              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











              9














              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 exported 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 "$@";





              share|improve this answer





























                9














                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 exported 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 "$@";





                share|improve this answer



























                  9












                  9








                  9







                  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 exported 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 "$@";





                  share|improve this answer















                  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 exported 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 "$@";






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 5 '18 at 21:57

























                  answered Feb 6 '14 at 11:29









                  DocSalvagerDocSalvager

                  1,30921732




                  1,30921732





















                      8














                      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.






                      share|improve this answer

























                      • How does this propagation of functions to children work?

                        – HappyFace
                        Dec 16 '18 at 21:27















                      8














                      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.






                      share|improve this answer

























                      • How does this propagation of functions to children work?

                        – HappyFace
                        Dec 16 '18 at 21:27













                      8












                      8








                      8







                      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.






                      share|improve this answer















                      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.







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited Aug 19 '18 at 8:12









                      tripleee

                      5,31811931




                      5,31811931










                      answered Feb 8 '12 at 19:22









                      Jan SteinmanJan Steinman

                      1311




                      1311












                      • 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
















                      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











                      6














                      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.






                      share|improve this answer



























                        6














                        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.






                        share|improve this answer

























                          6












                          6








                          6







                          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.






                          share|improve this answer













                          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.







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Oct 3 '15 at 20:25









                          ledenleden

                          19615




                          19615





















                              6














                              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.






                              share|improve this answer





























                                6














                                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.






                                share|improve this answer



























                                  6












                                  6








                                  6







                                  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.






                                  share|improve this answer















                                  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.







                                  share|improve this answer














                                  share|improve this answer



                                  share|improve this answer








                                  edited Jan 26 '18 at 1:40









                                  Jeff Schaller

                                  45.1k1164147




                                  45.1k1164147










                                  answered Feb 6 '12 at 10:26









                                  user unknownuser unknown

                                  7,47112450




                                  7,47112450





















                                      4














                                      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.






                                      share|improve this answer




















                                      • 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











                                      • 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







                                      • 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















                                      4














                                      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.






                                      share|improve this answer




















                                      • 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











                                      • 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







                                      • 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













                                      4












                                      4








                                      4







                                      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.






                                      share|improve this answer















                                      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.







                                      share|improve this answer














                                      share|improve this answer



                                      share|improve this answer








                                      edited May 9 '12 at 15:50

























                                      answered May 9 '12 at 15:44









                                      MikelMikel

                                      40.3k10103128




                                      40.3k10103128







                                      • 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











                                      • 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







                                      • 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












                                      • 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











                                      • 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







                                      • 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







                                      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











                                      3














                                      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.






                                      share|improve this answer


















                                      • 5





                                        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















                                      3














                                      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.






                                      share|improve this answer


















                                      • 5





                                        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













                                      3












                                      3








                                      3







                                      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.






                                      share|improve this answer













                                      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.







                                      share|improve this answer












                                      share|improve this answer



                                      share|improve this answer










                                      answered Feb 10 '12 at 16:37









                                      corvinuscorvinus

                                      1462




                                      1462







                                      • 5





                                        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












                                      • 5





                                        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







                                      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











                                      2














                                      My rule of thumb is:



                                      • aliases - one command, no parameters

                                      • functions - one command some parameters

                                      • script - several commands, no parameters





                                      share|improve this answer



























                                        2














                                        My rule of thumb is:



                                        • aliases - one command, no parameters

                                        • functions - one command some parameters

                                        • script - several commands, no parameters





                                        share|improve this answer

























                                          2












                                          2








                                          2







                                          My rule of thumb is:



                                          • aliases - one command, no parameters

                                          • functions - one command some parameters

                                          • script - several commands, no parameters





                                          share|improve this answer













                                          My rule of thumb is:



                                          • aliases - one command, no parameters

                                          • functions - one command some parameters

                                          • script - several commands, no parameters






                                          share|improve this answer












                                          share|improve this answer



                                          share|improve this answer










                                          answered Dec 10 '15 at 2:00









                                          Michael DurrantMichael Durrant

                                          16.6k46122189




                                          16.6k46122189





















                                              1














                                              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






                                              share|improve this answer



























                                                1














                                                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






                                                share|improve this answer

























                                                  1












                                                  1








                                                  1







                                                  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






                                                  share|improve this answer













                                                  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







                                                  share|improve this answer












                                                  share|improve this answer



                                                  share|improve this answer










                                                  answered Jan 6 '16 at 18:39









                                                  tjb63tjb63

                                                  7111




                                                  7111





















                                                      0














                                                      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



                                                      1. brings me to a certain directory.

                                                      2. defines a few variables.

                                                      3. 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:



                                                      1. 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.

                                                      2. A similar case accoured to me when I created a script to reload all my dotfiles.3



                                                      1. The script is available in my dotfiles repository under .bin/.


                                                      2. 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 certain csv file. The variables it defines are taken from the makefile in that directory. The script runs afterwards ls -l and git status to show me what's going on there.

                                                      3. That script is also available in my dotfiles repository under .bin/ as well.






                                                      share|improve this answer


















                                                      • 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















                                                      0














                                                      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



                                                      1. brings me to a certain directory.

                                                      2. defines a few variables.

                                                      3. 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:



                                                      1. 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.

                                                      2. A similar case accoured to me when I created a script to reload all my dotfiles.3



                                                      1. The script is available in my dotfiles repository under .bin/.


                                                      2. 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 certain csv file. The variables it defines are taken from the makefile in that directory. The script runs afterwards ls -l and git status to show me what's going on there.

                                                      3. That script is also available in my dotfiles repository under .bin/ as well.






                                                      share|improve this answer


















                                                      • 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













                                                      0












                                                      0








                                                      0







                                                      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



                                                      1. brings me to a certain directory.

                                                      2. defines a few variables.

                                                      3. 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:



                                                      1. 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.

                                                      2. A similar case accoured to me when I created a script to reload all my dotfiles.3



                                                      1. The script is available in my dotfiles repository under .bin/.


                                                      2. 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 certain csv file. The variables it defines are taken from the makefile in that directory. The script runs afterwards ls -l and git status to show me what's going on there.

                                                      3. That script is also available in my dotfiles repository under .bin/ as well.






                                                      share|improve this answer













                                                      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



                                                      1. brings me to a certain directory.

                                                      2. defines a few variables.

                                                      3. 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:



                                                      1. 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.

                                                      2. A similar case accoured to me when I created a script to reload all my dotfiles.3



                                                      1. The script is available in my dotfiles repository under .bin/.


                                                      2. 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 certain csv file. The variables it defines are taken from the makefile in that directory. The script runs afterwards ls -l and git status to show me what's going on there.

                                                      3. That script is also available in my dotfiles repository under .bin/ as well.







                                                      share|improve this answer












                                                      share|improve this answer



                                                      share|improve this answer










                                                      answered Apr 25 '16 at 19:32









                                                      Doron BeharDoron Behar

                                                      19212




                                                      19212







                                                      • 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





                                                        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











                                                      -8














                                                      1. alias for single line text replacement

                                                      2. scripts for anything more.





                                                      share|improve this answer





























                                                        -8














                                                        1. alias for single line text replacement

                                                        2. scripts for anything more.





                                                        share|improve this answer



























                                                          -8












                                                          -8








                                                          -8







                                                          1. alias for single line text replacement

                                                          2. scripts for anything more.





                                                          share|improve this answer















                                                          1. alias for single line text replacement

                                                          2. scripts for anything more.






                                                          share|improve this answer














                                                          share|improve this answer



                                                          share|improve this answer








                                                          edited Feb 10 '12 at 21:47









                                                          Nils

                                                          12.8k73771




                                                          12.8k73771










                                                          answered Feb 6 '12 at 5:16









                                                          elieli

                                                          18026




                                                          18026



























                                                              draft saved

                                                              draft discarded
















































                                                              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.




                                                              draft saved


                                                              draft discarded














                                                              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





















































                                                              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







                                                              Popular posts from this blog

                                                              getting Checkpoint VPN SSL Network Extender working in the command lineHow to connect to CheckPoint VPN on Ubuntu 18.04LTS?Will the Linux ( red-hat ) Open VPNC Client connect to checkpoint or nortel VPN gateways?VPN client for linux machine + support checkpoint gatewayVPN SSL Network Extender in FirefoxLinux Checkpoint SNX tool configuration issuesCheck Point - Connect under Linux - snx + OTPSNX VPN Ububuntu 18.XXUsing Checkpoint VPN SSL Network Extender CLI with certificateVPN with network manager (nm-applet) is not workingWill the Linux ( red-hat ) Open VPNC Client connect to checkpoint or nortel VPN gateways?VPN client for linux machine + support checkpoint gatewayImport VPN config files to NetworkManager from command lineTrouble connecting to VPN using network-manager, while command line worksStart a VPN connection with PPTP protocol on command linestarting a docker service daemon breaks the vpn networkCan't connect to vpn with Network-managerVPN SSL Network Extender in FirefoxUsing Checkpoint VPN SSL Network Extender CLI with certificate

                                                              NetworkManager fails with “Could not find source connection”Trouble connecting to VPN using network-manager, while command line worksHow can I be notified about state changes to a VPN adapterBacktrack 5 R3 - Refuses to connect to VPNFeed all traffic through OpenVPN for a specific network namespace onlyRun daemon on startup in Debian once openvpn connection establishedpfsense tcp connection between openvpn and lan is brokenInternet connection problem with web browsers onlyWhy does NetworkManager explicitly support tun/tap devices?Browser issues with VPNTwo IP addresses assigned to the same network card - OpenVPN issues?Cannot connect to WiFi with nmcli, although secrets are provided

                                                              대한민국 목차 국명 지리 역사 정치 국방 경제 사회 문화 국제 순위 관련 항목 각주 외부 링크 둘러보기 메뉴북위 37° 34′ 08″ 동경 126° 58′ 36″ / 북위 37.568889° 동경 126.976667°  / 37.568889; 126.976667ehThe Korean Repository문단을 편집문단을 편집추가해Clarkson PLC 사Report for Selected Countries and Subjects-Korea“Human Development Index and its components: P.198”“http://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EA%B5%AD%EA%B8%B0%EB%B2%95”"한국은 국제법상 한반도 유일 합법정부 아니다" - 오마이뉴스 모바일Report for Selected Countries and Subjects: South Korea격동의 역사와 함께한 조선일보 90년 : 조선일보 인수해 혁신시킨 신석우, 임시정부 때는 '대한민국' 국호(國號) 정해《우리가 몰랐던 우리 역사: 나라 이름의 비밀을 찾아가는 역사 여행》“남북 공식호칭 ‘남한’‘북한’으로 쓴다”“Corea 대 Korea, 누가 이긴 거야?”국내기후자료 - 한국[김대중 前 대통령 서거] 과감한 구조개혁 'DJ노믹스'로 최단기간 환란극복 :: 네이버 뉴스“이라크 "韓-쿠르드 유전개발 MOU 승인 안해"(종합)”“해외 우리국민 추방사례 43%가 일본”차기전차 K2'흑표'의 세계 최고 전력 분석, 쿠키뉴스 엄기영, 2007-03-02두산인프라, 헬기잡는 장갑차 'K21'...내년부터 공급, 고뉴스 이대준, 2008-10-30과거 내용 찾기mk 뉴스 - 구매력 기준으로 보면 한국 1인당 소득 3만弗과거 내용 찾기"The N-11: More Than an Acronym"Archived조선일보 최우석, 2008-11-01Global 500 2008: Countries - South Korea“몇년째 '시한폭탄'... 가계부채, 올해는 터질까”가구당 부채 5000만원 처음 넘어서“‘빚’으로 내몰리는 사회.. 위기의 가계대출”“[경제365] 공공부문 부채 급증…800조 육박”“"소득 양극화 다소 완화...불평등은 여전"”“공정사회·공생발전 한참 멀었네”iSuppli,08年2QのDRAMシェア・ランキングを発表(08/8/11)South Korea dominates shipbuilding industry | Stock Market News & Stocks to Watch from StraightStocks한국 자동차 생산, 3년 연속 세계 5위자동차수출 '현대-삼성 웃고 기아-대우-쌍용은 울고' 과거 내용 찾기동반성장위 창립 1주년 맞아Archived"중기적합 3개업종 합의 무시한 채 선정"李대통령, 사업 무분별 확장 소상공인 생계 위협 질타삼성-LG, 서민업종인 빵·분식사업 잇따라 철수상생은 뒷전…SSM ‘몸집 불리기’ 혈안Archived“경부고속도에 '아시안하이웨이' 표지판”'철의 실크로드' 앞서 '말(言)의 실크로드'부터, 프레시안 정창현, 2008-10-01“'서울 지하철은 안전한가?'”“서울시 “올해 안에 모든 지하철역 스크린도어 설치””“부산지하철 1,2호선 승강장 안전펜스 설치 완료”“전교조, 정부 노조 통계서 처음 빠져”“[Weekly BIZ] 도요타 '제로 이사회'가 리콜 사태 불러들였다”“S Korea slams high tuition costs”““정치가 여론 양극화 부채질… 합리주의 절실””“〈"`촛불집회'는 민주주의의 질적 변화 상징"〉”““촛불집회가 민주주의 왜곡 초래””“국민 65%, "한국 노사관계 대립적"”“한국 국가경쟁력 27위‥노사관계 '꼴찌'”“제대로 형성되지 않은 대한민국 이념지형”“[신년기획-갈등의 시대] 갈등지수 OECD 4위…사회적 손실 GDP 27% 무려 300조”“2012 총선-대선의 키워드는 '국민과 소통'”“한국 삶의 질 27위, 2000년과 2008년 연속 하위권 머물러”“[해피 코리아] 행복점수 68점…해외 평가선 '낙제점'”“한국 어린이·청소년 행복지수 3년 연속 OECD ‘꼴찌’”“한국 이혼율 OECD중 8위”“[통계청] 한국 이혼율 OECD 4위”“오피니언 [이렇게 생각한다] `부부의 날` 에 돌아본 이혼율 1위 한국”“Suicide Rates by Country, Global Health Observatory Data Repository.”“1. 또 다른 차별”“오피니언 [편집자에게] '왕따'와 '패거리 정치' 심리는 닮은꼴”“[미래한국리포트] 무한경쟁에 빠진 대한민국”“대학생 98% "외모가 경쟁력이라는 말 동의"”“특급호텔 웨딩·200만원대 유모차… "남보다 더…" 호화病, 고질병 됐다”“[스트레스 공화국] ① 경쟁사회, 스트레스 쌓인다”““매일 30여명 자살 한국, 의사보다 무속인에…””“"자살 부르는 '우울증', 환자 중 85% 치료 안 받아"”“정신병원을 가다”“대한민국도 ‘묻지마 범죄’,안전지대 아니다”“유엔 "학생 '성적 지향'에 따른 차별 금지하라"”“유엔아동권리위원회 보고서 및 번역본 원문”“고졸 성공스토리 담은 '제빵왕 김탁구' 드라마 나온다”“‘빛 좋은 개살구’ 고졸 취업…실습 대신 착취”원본 문서“정신건강, 사회적 편견부터 고쳐드립니다”‘소통’과 ‘행복’에 목 마른 사회가 잠들어 있던 ‘심리학’ 깨웠다“[포토] 사유리-곽금주 교수의 유쾌한 심리상담”“"올해 한국인 평균 영화관람횟수 세계 1위"(종합)”“[게임연중기획] 게임은 문화다-여가활동 1순위 게임”“영화속 ‘영어 지상주의’ …“왠지 씁쓸한데””“2월 `신문 부수 인증기관` 지정..방송법 후속작업”“무료신문 성장동력 ‘차별성’과 ‘갈등해소’”대한민국 국회 법률지식정보시스템"Pew Research Center's Religion & Public Life Project: South Korea"“amp;vwcd=MT_ZTITLE&path=인구·가구%20>%20인구총조사%20>%20인구부문%20>%20 총조사인구(2005)%20>%20전수부문&oper_YN=Y&item=&keyword=종교별%20인구& amp;lang_mode=kor&list_id= 2005년 통계청 인구 총조사”원본 문서“한국인이 좋아하는 취미와 운동 (2004-2009)”“한국인이 좋아하는 취미와 운동 (2004-2014)”Archived“한국, `부분적 언론자유국' 강등〈프리덤하우스〉”“국경없는기자회 "한국, 인터넷감시 대상국"”“한국, 조선산업 1위 유지(S. Korea Stays Top Shipbuilding Nation) RZD-Partner Portal”원본 문서“한국, 4년 만에 ‘선박건조 1위’”“옛 마산시,인터넷속도 세계 1위”“"한국 초고속 인터넷망 세계1위"”“인터넷·휴대폰 요금, 외국보다 훨씬 비싸”“한국 관세행정 6년 연속 세계 '1위'”“한국 교통사고 사망자 수 OECD 회원국 중 2위”“결핵 후진국' 한국, 환자가 급증한 이유는”“수술은 신중해야… 자칫하면 생명 위협”대한민국분류대한민국의 지도대한민국 정부대표 다국어포털대한민국 전자정부대한민국 국회한국방송공사about korea and information korea브리태니커 백과사전(한국편)론리플래닛의 정보(한국편)CIA의 세계 정보(한국편)마리암 부디아 (Mariam Budia),『한국: 하늘이 내린 한 폭의 그림』, 서울: 트랜스라틴 19호 (2012년 3월)대한민국ehehehehehehehehehehehehehehWorldCat132441370n791268020000 0001 2308 81034078029-6026373548cb11863345f(데이터)00573706ge128495