Я написал скрипт bash в текстовом редакторе. Какое расширение я могу сохранить мой скрипт, чтобы он мог работать как скрипт bash? Я создал скрипт, который теоретически должен запускать ssh-сервер. Мне интересно, как заставить скрипт выполняться, когда я нажимаю на него. Я использую OS X 10.9.5.
Что такое расширение файла Bash?
Ответ 1
Не соглашаясь с другими ответами, существует общее соглашение использовать расширение .sh
для сценариев оболочки - но это не полезное соглашение. Лучше вообще не использовать расширение. Преимущество возможности сказать, что foo.sh
является сценарием оболочки, поскольку его имя минимально, и вы платите за него с потерей гибкости.
Чтобы сделать исполняемый скрипт bash, он должен иметь строку shebang вверху:
#!/bin/bash
и используйте команду chmod +x
чтобы система распознала его как исполняемый файл. Затем его необходимо установить в один из каталогов, перечисленных в вашем $PATH
. Если скрипт называется foo
, вы можете запустить его из командной строки, набрав foo
. Или, если он находится в текущем каталоге (обычно для временных скриптов), вы можете набрать ./foo
.
Ни оболочка, ни операционная система не обращают внимания на часть расширения имени файла. Это просто часть названия. И не давая ему специального расширения, вы гарантируете, что любому (пользователю или другому сценарию), который его использует, не нужно заботиться о том, как он был реализован, будь то сценарий оболочки (sh, bash, csh или что-то еще) сценарий Perl, Python или Awk или двоичный исполняемый файл. Система специально разработана таким образом, что интерпретируемый сценарий или исполняемый двоичный файл могут быть вызваны, не зная и не заботясь о том, как она реализована.
UNIX-подобные системы начинались с чисто текстового интерфейса командной строки. GUI, такие как KDE и Gnome, были добавлены позже. В настольной системе с графическим интерфейсом обычно можно запустить программу (опять же, будь то скрипт или исполняемый двоичный файл), например, дважды щелкнув по значку, который к ней относится. Как правило, это отбрасывает любой вывод, который может напечатать программа, и не позволяет передавать аргументы командной строки; это гораздо менее гибко, чем запускать его из командной строки. Но для некоторых программ (в основном для клиентов с графическим интерфейсом) это может быть удобнее.
Сценарии оболочки лучше всего изучать из командной строки, а не из графического интерфейса.
(Некоторые инструменты обращают внимание на расширения файлов. Например, компиляторы обычно используют расширение для определения языка, на котором написан код: .c
для C, .cpp
для c++ и т.д. Это соглашение не применяется к исполняемым файлам. файлы.)
Имейте в виду, что UNIX (и UNIX-подобные системы) не являются Windows. MS Windows обычно использует расширение файла, чтобы определить, как его открыть/выполнить. Двоичные исполняемые файлы должны иметь расширение .exe
. Если в Windows установлена UNIX-подобная оболочка, вы можете настроить Windows для распознавания расширения .sh
как сценария оболочки и использовать оболочку для его открытия; Windows не имеет #!
условность.
Ответ 2
Вам не нужно никакого расширения (или вы можете выбрать произвольное расширение, но .sh
- полезное соглашение).
Вы должны начать свой скрипт с #!/bin/bash
(эту первую строку понимает системный вызов execve (2)), и вы должны сделать свой файл исполняемым с помощью chmod u+x
. так что если ваш скрипт находится в каком-то файле $HOME/somedir/somescriptname.sh
вам нужно набрать один раз
chmod u+x $HOME/somedir/somescriptname.sh
в терминале. См. Chmod (1) для команды и chmod (2) для системного вызова.
Если вы не вводите полный путь к файлу, вы должны поместить этот файл в какой-то каталог, указанный в вашем PATH
(см. Environment (7) и execvp (3)), который вы можете навсегда установить в вашем ~/.bashrc
если ваша оболочка входа bash
)
Кстати, вы можете написать свой скрипт на другом языке, например, на Python, запустив его с #!/usr/bin/python
или в Ocaml, запустив его с #!/usr/bin/ocaml
...
Выполнение вашего сценария двойным щелчком мыши (что? Вы не сказали!) Является проблемой среды рабочего стола и может зависеть от рабочего стола (может отличаться в Kde, Mate, Gnome,.... или IceWM или RatPoison). Возможно, чтение спецификации EWMH поможет вам получить более качественную картину.
Возможно, выполнение исполняемого скрипта с помощью chmod
может сделать его кликабельным на вашем рабочем столе (очевидно, Quartz в MacOSX).Но тогда вы, вероятно, должны сделать это дать некоторую визуальную обратную связь.
И на некоторых компьютерах нет рабочего стола, в том числе вашего собственного, когда вы получаете к нему удаленный доступ с помощью ssh.
Я не верю, что это хорошая идея - запустить скрипт оболочки, нажав. Вы, вероятно, хотите иметь возможность аргументировать свой сценарий оболочки (и как бы вы это сделали, нажав?), И вам следует позаботиться о его выводе. Если вы можете написать сценарий оболочки, вы можете использовать интерактивную оболочку в терминале. Это лучший и самый естественный способ использовать скрипт. Хорошие интерактивные оболочки (например, zsh или fish или, возможно, недавний bash
) имеют восхитительные и настраиваемые средства автозаполнения, и вам не придется много печатать (научитесь использовать клавишу tab на клавиатуре). Кроме того, сценарии и программы часто являются частями составных команд (конвейеры и т.д.).
PS. Я использую Unix с 1986 года, а Linux с 1993 года. Я никогда не запускал свои собственные программы или скрипты, нажимая. Почему я должен?
Ответ 3
просто .sh
.
Запустите script следующим образом:
./script.sh
EDIT: Как сказал анубхава, расширение не имеет большого значения. Но по организационным причинам по-прежнему рекомендуется использовать расширения.
Ответ 4
Я знаю, что сейчас это довольно старо, но я чувствую, что это добавляет к тому, о чем спрашивал вопрос.
Если вы используете Mac и хотите запустить скрипт, дважды щелкнув по нему, вам нужно использовать расширение .command
. Также, как и прежде, сделайте исполняемый файл с помощью chmod -x
.
Как было отмечено ранее, это не очень полезно.
Ответ 5
TL; DR - если пользователь (не обязательно разработчик) сценария использует графический интерфейс, это зависит от того, какой файловый браузер они используют. Для .sh
скрипта MacOS Finder потребуется расширение .sh
. Gnome Nautilus, однако, распознает сценарии с правильным расширением с расширением .sh
или без него.
Я знаю, что уже много раз говорилось о причинах и против использования расширений в сценариях bash, но не столько о том, почему или почему не следует использовать расширения, но у меня есть то, что я считаю хорошим практическим правилом.
Если вы относитесь к типу, который подключается и выходит из bash и использует терминал в целом, или разрабатываете инструмент для кого-то, кто не использует терминал, .sh
расширение .sh
в свои сценарии bash. Таким образом, пользователи этого сценария могут дважды щелкнуть этот файл в браузере файлов с графическим интерфейсом, чтобы запустить сценарий.
Если вы тот тип, который в основном выполняет всю или большую часть вашей работы в терминале, не беспокойтесь о том, чтобы добавлять какие-либо расширения в ваши bash-скрипты. Они будут бесполезны в терминале, если вы уже настроили файл ~/.bashrc
для визуального различения сценариев от каталогов.
Редактировать:
В файловом браузере Gnome Nautilus с 4 тестовыми файлами (каждый с разрешениями, данными для исполняемого файла) с тупо простой командой bash, чтобы открыть окно терминала (gnome-terminal
):
-
Файл без расширения с
#!/bin/bash
в первой строке.Работало двойным щелчком по файлу.
-
Файл с расширением
.sh
с#!/bin/bash
в первой строке.Работало двойным щелчком по файлу.
-
Файл с расширением NO с NO
#!/bin/bash
в первой строке.Это сработало, дважды щелкнув по файлу... технически, но графический интерфейс не показал, что это был скрипт оболочки. Он сказал, что это был просто текстовый файл.
-
Файл с расширением
.sh
с NO#!/bin/bash
в первой строке.Работало двойным щелчком по файлу.
Однако, как мудро указал Кит Томпсон в комментариях к этому ответу, полагаясь на использование расширения .sh
вместо bash shebang в первой строке файла (#!/bin/bash
), это может вызвать проблемы.
Однако я вспоминаю, что когда я ранее использовал MacOS, сценарии bash, даже если они были правильно написаны (это слово?) Без расширения .sh
не могли быть запущены из графического интерфейса на MacOS. Я хотел бы, чтобы кто-то поправил меня в комментариях. Если это так, то это доказывает, что существует по крайней мере один файловый браузер, где имеет значение расширение .sh
.