Подтвердить что ты не робот

Что такое расширение файла Bash?

Я написал скрипт bash в текстовом редакторе. Какое расширение я могу сохранить мой скрипт, чтобы он мог работать как скрипт bash? Я создал скрипт, который теоретически должен запускать ssh-сервер. Мне интересно, как заставить скрипт выполняться, когда я нажимаю на него. Я использую OS X 10.9.5.

4b9b3361

Ответ 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):

  1. Файл без расширения с #!/bin/bash в первой строке.

    Работало двойным щелчком по файлу.

  2. Файл с расширением .sh с #!/bin/bash в первой строке.

    Работало двойным щелчком по файлу.

  3. Файл с расширением NO с NO #!/bin/bash в первой строке.

    Это сработало, дважды щелкнув по файлу... технически, но графический интерфейс не показал, что это был скрипт оболочки. Он сказал, что это был просто текстовый файл.

  4. Файл с расширением .sh с NO #!/bin/bash в первой строке.

    Работало двойным щелчком по файлу.

Однако, как мудро указал Кит Томпсон в комментариях к этому ответу, полагаясь на использование расширения .sh вместо bash shebang в первой строке файла (#!/bin/bash), это может вызвать проблемы.

Однако я вспоминаю, что когда я ранее использовал MacOS, сценарии bash, даже если они были правильно написаны (это слово?) Без расширения .sh не могли быть запущены из графического интерфейса на MacOS. Я хотел бы, чтобы кто-то поправил меня в комментариях. Если это так, то это доказывает, что существует по крайней мере один файловый браузер, где имеет значение расширение .sh.