sh file.sh 和 file.sh 的区别

sh file.sh 和 file.sh 的区别

我有两个问题:

  1. sh filename.sh执行和有什么区别filename.sh
  2. 我怎样才能让它们两者给出相同的输出?

我问这个问题是因为我现在遇到了一个问题。我正在尝试运行Java + SWT来自终端的应用程序。

当我执行 时filename.sh,它会给出我想要的输出。但是当我执行sh filename.sh或 时bash filename.sh,它会抛出一个错误:

Exception in thread "main" java.lang.NoClassDefFoundError: MainForm/java
Caused by: java.lang.ClassNotFoundException: MainForm.java
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: MainForm.java.  Program will exit.

我知道这个问题已经在这里问过了,但我仍然不清楚。

我已浏览过以下链接:

运行脚本 ./ 和 sh 有什么区别?

即使未将脚本设置为可执行文件,它们也可以运行吗?

谁能帮我这个?

答案1

该脚本可能知道它应该在哪个 shell 中运行。第一行可能是这样的

#!/bin/bash

如果使用 运行它sh,第一行(又名 shebang)将被忽略。不同的 shell 尝试运行该脚本,但无法理解它 - 这就像在 Pascal 中运行 Java 代码一样。如果使用正确的 shell 运行它,它的行为应该相同:

/bin/bash script.sh

答案2

通过在文件前面放置bashsh,可以强制使用此 shell 来执行文件。因此,最好使用文件的第一行:

#!/path/to/shell

因此,每次执行文件时都会使用相同的 shell。

对于第二个问题,不,您需要使脚本可执行才能运行它:

chmod +x file.sh

相关内容