У меня есть два вопроса:
sh filename.sh
и filename.sh
? Я задаю этот вопрос, так как сейчас я столкнулся с проблемой. Я пытаюсь запустить приложение 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 для запуска скрипта?
Могут ли скрипты работать даже когда они не установлены как исполняемые?
Может кто-нибудь помочь мне с этим?
Сценарий, вероятно, знает, в какой оболочке он должен работать. Первая строка может выглядеть примерно так:
#!/bin/bash
Если вы запустите его с sh
, первая строка (a.k.a. shebang) игнорируется. Другая оболочка пытается запустить скрипт, но не понимает его - это все равно, что запускать Java-код в Pascal. Если вы запускаете его с правильной оболочкой, он должен вести себя одинаково:
/bin/bash script.sh
Поместив bash
или sh
перед вашим файлом, вы заставляете использовать эту оболочку для запуска вашего файла. Поэтому лучше использовать первую строку файла:
#!/path/to/shell
Так что каждый раз, когда вы выполняете свой файл, он будет с одной и той же оболочкой.
И для вашего второго вопроса, нет, вам нужно сделать исполняемый скрипт для его запуска:
chmod +x file.sh