为什么使用 sh 和 ./ 运行相同的脚本会返回不同的输出

为什么使用 sh 和 ./ 运行相同的脚本会返回不同的输出

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"

为什么输出会有差异?

$ sh emp1.sh
Enter the pattern to be searched: 
$ ./emp1.sh
Enter the pattern to be searched: \c

答案1

实际上有两个不同的 shell。一个是 ,/bin/bash另一个是/bin/dash。而/bin/sh实际上是 的软链接/bin/dash。要验证这一点,请在终端中输入:

which sh

你将获得输出:/bin/sh

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

lrwxrwxrwx 1 root root 4 May 16 20:23 /bin/sh -> dash

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

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

这里发生了什么

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

答案2

由于您使用了两个不同的程序,因此输出不同。

在第一种情况下,sh emp1.sh您启动一​​个名为的程序sh并告诉它执行 emp1.sh 中的指令。该程序 sh 可能是 bourne shell (sh),一种 bourne再次shell(bash)尝试模拟经典shell(因此其反应与其本机模式不同)、dash或甚至其他任何东西。

当您使用时,./emp1.sh您尝试执行脚本 empt1.sh 本身。它的第一行包含一个 shebang 和一个解释器 ( #!/bin/bash),告诉它需要使用 bash(及其所有功能)。

这意味着你使用的程序/模式与第一种情况不同。并且你会得到不同的输出。

为了验证这一点,请尝试以下两种方法之一:

  • /bin/bash emp1.sh (其应产生与 ./emp1.sh 相同的输出)
  • 或者将第一行改为#!/bin/sh

相关内容