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( ),bash
shell 会处理它。因此,输出格式会略有不同。请记住,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
。