[[: Not Found error resolution--bash in Bash script summary 1
Today, when writing a script, there is a strange problem: use [[: Not found] in the script. It is natural to solve problems when encountering problems.
1. Is the bash version used too low?
Bash--version View bash version information as follows
[Email protected]:~ $bash--version GNU Bash, version 3.2.39 (1)-release (I486-PC-LINUX-GNU) Copyright (C) Free Software Foundation, Inc. |
In Google Bash Manual, 3.2.39 is not low enough to fully support [[such an extension. It doesn't appear to be a version issue.
2. is in the script [[use error?]
Write test scripts to test. The contents of the Test.sh test script are as follows
#!/bin/bash [[1]] && echo "successful" |
is still "[[: Not found] after execution. However, execution of [[1]] && echo "successful" command in Bash Interactive mode is successful and results are as follows
[Email protected]:~$ [[1]] && echo "successful" Successful [Email protected]:~$ |
It seems that bash is supported [[Extended, so the problem should be on the script.]
3. Where does the problem in the script exist?
Obviously, the lone command is fine because it has been validated in interactive mode. There's another line in the script #!/bin/bash
Used to specify the type of shell used to run the script. Obviously, we're going to use bash here, so there's no problem with this line.
4. Since there is no problem with the contents of the script, where is the problem?
From the writing and running a few links to think carefully, since the script is not a problem, the question is not in the operation of the link? Out of habit, I often like $ sh test.sh such a way to run scripts, then, a different mode of operation can solve the problem? Run with./test.sh under Terminal, sure enough, run successfully! At this point, the crux of the problem is found.
4.1 The following question is why SH test.sh and./test.sh have different operating results.
By viewing (ls-l/bin), SH is just a symbolic link, and the final point is a program called Dash.
[Email protected]:~$ ls-hl/bin | grep sh -rwxr-xr-x 1 root root 686K 2008-05-13 02:33 bash -rwxr-xr-x 1 root root 79K 2009-03-09 21:03 Dash lrwxrwxrwx 1 root root 4 2010-03-03 01:52 Rbash Bash lrwxrwxrwx 1 root root 4 2010-03-03 01:53 sh, dash lrwxrwxrwx 1 root root 4 2010-03-03 01:53 sh.distrib Bash |
When you run SH test.sh, the SH command is called first, and sh points to dash, so sh test.sh is equivalent to/bin/dash test.sh. The dash, either the name or the program size, is different from bash. It is not surprising, then, that the SH test.sh and./test.sh Two commands have different execution results.
When the./test.sh command is executed, Bash automatically generates a subshell to execute the command, which means that executing the filename arguments is equivalent to executing the bash filename arguments.
4.2 The remaining question is, what is the difference between dash and bash?
The answer is given on the Ubuntu wiki. Since Ubuntu 6.10, the default shell/bin/sh of the system has been changed to dash. Dash (the Debian almquist shell) is a much smaller but still POSIX-compliant shell that consumes less disk space, executes shell scripts faster than bash, relies on fewer library files, and, of course, is not functionally comparable to bash. Dash comes from the NetBSD version of the Almquist Shell (ASH).
The main reason to change the default shell to dash in Ubuntu is efficiency. Because of the need to launch a large number of shell scripts during Ubuntu startup, Ubuntu has made such changes in order to optimize startup speed and resource usage.
4.3 How to avoid the problem caused by dash?
1. If dash affects only a few shell scripts, the most convenient workaround is to modify the script to specify the correct shell interpreter in the script
#!/bin/sh Change to #!/bin/bash
2. If dash affects the makefile file, you need to specify the following variables at the beginning of the file
3. If the scope of the impact is wide enough to modify a few separate files to resolve the problem, you can stop installing dash as/bin/sh
sudo dpkg-reconfigure Dash |
It is important to note that such modifications will affect the boot speed of the system and may even affect some scripts that rely on Dash's unique features (which bash does not provide).
4.4 How do I avoid these effects when I write a script?
First, you can use the checkbashisms command to check if the script is "bash" (bashism). To use checkbashisms, you need to install the Devscripts package first
Aptitude Install Devscripts Checkbashisms test.sh |
Second, you need to be aware of the POSIX-compliant syntax when scripting, making the script "POSIX shell."
[[: Not Found error resolution in bash script]