While, trying out rails deployment with Capistrano, I have seen use of sh multiple time in the Capistrano terminal log. To get some detail on it, I searched on Google and find very good documentation here. Technically, sh command executes the Bourne shell, likely taking you to a $ prompt.The simplest definition I will give is that “sh command execute terminal command from any file with .sh extension”
=> Example:
Create a file with .sh extension, say trying_out.sh
Add below lines to the file
#!/bin/sh # this is the default location, so you can ignore it, but mention it if your sh script is located at some other place. As a good practice always mention it
mkdir my_folder #it will create my_folder directory
cd my_folder # will take you to my_folder directory
mkdir my_notes #again make a directory my_notes within my_folder directory
cd my_notes #take you to my_notes folder
touch first_note.txt #create a first_notes.txt file within my notes directory
echo “see your sh example is working” >> first_note.txt # add a line to the first_notes file
cat first_note.txt #print the content of first_notes.txt on the terminal
Now go terminal and run the below command
arun@arun-yadav:~$ sh trying_out.sh
see your sh example is working # this is the result of last command in our trying_out.sh file
Now, if you check your folders, you will see all the newly created content
=> Running a .sh file
.sh file is nothing but the shell script to install given application or to perform other tasks under UNIX like operating systems. When we download any software, we find install.sh file which basically conten a set of command to be exicuted on the terminal. We can run any .sh file in following way
-> $ sh filename.sh
-> $ bash filename.sh # sh is also a bash script, so this will also work
-> $ ./filename.sh #this will work if the file.sh have executable permission, you can grant it with chmod +x filename.sh command, if not already there.more detail on managing file permission is available here
-> $ sudo bash filename.sh # above will not work if, the file need to be executed by root user, in that case use this command, alternatively you can login as root user with su – command and use any of the above method
=> sh options
You can, provide a no of options to sh to suit your need. The complete list is available here. A sh command with all the options will look something like this
sh [-a] [-c] [-C] [-e] [-E] [-f] [-h] [-i] [-I][-k] [-m] [-n] [-p] [-r] [-s] [-t] [-T] [-u] [-v] [-x] [ argument ]
Explanation of some most commonly used options is is as below:
-c string #If the -c option is present, then commands are read from string. If there are arguments after the string, they are assigned to the positional parameters, starting with $0.
Example:
$ sh -c “mkdir my_folder && cd my_folder && touch my_notes.txt”
-C #Don’t overwrite existing files with “>.”
-i # If the -i option is present, the shell is interactive.
-I # Make bash act as if it had been invoked as a login shel
-s #If the -s option is present, or if no arguments remain after option processing, then commands are read from the standard input. This option allows the positional parameters to be set when invoking an interactive shell.
[argument] # this is basically a string of command when you are using -c option or the value you pass, interactively by using -s option. If arguments remain after option processing, and neither the -c nor the -s option has been supplied, the first argument is assumed to be the name of a file containing shell commands. If bash is invoked in this fashion, $0 is set to the name of the file, and the positional parameters are set to the remaining arguments. Bash reads and executes commands from this file, then exits. Bash’s exit status is the exit status of the last command executed in the script. If no commands are executed, the exit status is 0. An attempt is first made to open the file in the current directory, and, if no file is found, then the shell searches the directories in PATH for the script.