为什么使用 sh 和 ./ 运行相同的脚本提供不同的输出

1 command-line

emp1.sh脚本内容

#!/bin/bash
#emp1.sh: interactive version uses read to take input

echo "Enter the pattern to be searched: \c"
read pname
echo "Enter the file to be used: \c"
read flname
echo "searching for the pattern $pname from the file $flname"
grep "$pname" $flname
echo "Selected records are shown above"
Run Code Online (Sandbox Code Playgroud)

为什么输出之间存在差异?

$ sh emp1.sh
Enter the pattern to be searched: 
$ ./emp1.sh
Enter the pattern to be searched: \c
Run Code Online (Sandbox Code Playgroud)

sou*_* c. 5

事实上有两种不同的外壳。一个是/bin/bash,另一个是/bin/dash。实际上/bin/sh是一个软链接/bin/dash。要验证它,请在终端中写入,

which sh
Run Code Online (Sandbox Code Playgroud)

你会得到输出:/bin/sh

接下来ls -l /bin/sh在终端中输入,这将返回类似的内容,

lrwxrwxrwx 1 root root 4 May 16 20:23 /bin/sh -> dash
Run Code Online (Sandbox Code Playgroud)

这表明它sh是 的软链接/bin/dash。你可以进一步尝试which dash

实际上bash具有sh更多功能和更好的语法。两者的命令几乎相同,但又有所不同。

这里发生了什么

当您运行时sh emp1.sh,脚本由 处理,dash但是当您运行时,./emp1.sh由于#!/bin/bash脚本 shell 顶部的 shebang line( )bash会处理它。因此,输出的格式略有不同。请记住bash有一些改进的语法。