Let's now take a look at logical operators.
The first command is started in the background to continue until it has finished; immediately after starting first command, the second command is started and it will run in the foreground:
$ find / -name "*.z" & s ---------------- ----- Command1 command2
In the preceding example, first command such as find will start running in the background and while the find command is running in background, the ls command will start running in foreground.
The second command is only started if the first command is successful. To achieve this, the shell checks the exit (return) status of the first command and starts the second command only if and when that exit status is found to be "0".
$ ls /home/ganesh && echo "Command executed successfully" Since we are working as user ganesh, $ ls /root && echo "Command executed successfully"
Since we are working as a normal user, we cannot access the /root directory. Therefore, nothing will be printed on screen.
The second command is only started if the first command fails. The shell checks the exit status of the first command and starts the second command only if that exit status is not equal to "0".
$ ls /root || echo "Command execution failed"
Example:
$ ls || echo "command ls failed"
In the preceding example, if ls runs successfully, then echo will not be called. If the ls command fails such as $ ls /root and if user is not root, then ls will fail and the echo command will print command ls failed.
When && or || are used, the exit status of the first command is checked first, then the decision to perform the next will be taken.
For example:
$ ls $ echo $? 0 $ ls /root ls: /root: Permission denied $ echo $? 1 $ tar cvzf /dev/st0 /home /etc | | mail -s "Something went wrong with the backup" root
If we give the command as follows:
$ cd /home/student/work/temp/; rm –rf *
Initially, the shell will change to the /home/student/work/temp folder, and then it will delete all files and folders.
If we give the command as follows:
cd /backup/ol/home/student/work/temp/ && rm * -rf
This will first change to the required folder, and then the rm command will be called for deletion. The problem with ";" is that even if the shell fails to change to the required folder, the rm command will execute and it will delete all the files and folders from your original folder. This will be really dangerous.
For example:
$ [[ "a" = "b" ]]; echo ok ok
In this case, the [[ ]] expression will evaluate to false. Since the semicolon will not check the status of the earlier command, ok will be printed even if the first [[ ]] fails.
$ [[ "a" = "b" ]] && echo ok
In this case, the [[ ]] expression will evaluate to false. As the first expression is false, the "&&" operator will not proceed to execute the next command.
In this case, ok will be printed only if [[ ]] is true.