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

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


Не соглашаясь с другими ответами, существует общее соглашение об использовании расширения .sh для сценариев оболочки, но это не является полезным соглашением . Лучше вообще не использовать расширение. Преимущество возможности определить, что foo.sh — это сценарий оболочки, потому что его имя минимально, и вы платите за него с потерей гибкости.

Чтобы сделать сценарий bash исполняемым, он должен иметь строку shebang вверху:

  #!/Bin/bash  

и используйте команду chmod + x , чтобы система распознала его как исполняемый файл. Затем его необходимо установить в один из каталогов, перечисленных в вашем $ PATH . Если сценарий называется foo , вы можете выполнить его из приглашения оболочки, набрав foo . Или, если он находится в текущем каталоге (обычно для временных сценариев), вы можете ввести ./foo .

Ни оболочка, ни операционная система не обращают на это внимания часть расширения имени файла. Это просто часть имени. И, не давая ему специальное расширение, вы гарантируете, что любой (будь то пользователь или другой скрипт), который его использует, не должен заботиться о том, как он был реализован, будь то сценарий оболочки ( sh, bash, csh или что-то еще), сценарий Perl, Python или Awk или исполняемый двоичный файл. Система специально разработана таким образом, что интерпретируемый сценарий или двоичный исполняемый файл можно вызывать, не зная и не заботясь о том, как это реализовано.

UNIX-подобные системы начинались с чисто текстового интерфейса командной строки. Позже были добавлены графические интерфейсы, такие как KDE и Gnome. В настольной системе с графическим пользовательским интерфейсом вы обычно можете запустить программу (опять же, будь то скрипт или исполняемый файл), например, дважды щелкнув значок, который ссылается на него. Обычно это отбрасывает любой вывод, который программа могла бы напечатать, и не позволяет передавать аргументы командной строки; он гораздо менее гибкий, чем запуск из командной строки. Но для некоторых программ (в основном клиентов с графическим интерфейсом) это может быть более удобно.

Сценарии оболочки лучше всего изучать из командной строки, а не из графического интерфейса.

(Некоторые инструменты делают обращают внимание на расширения файлов. Например, компиляторы обычно используют расширение для определения языка, на котором написан код: .c для C, .cpp для c ++ и т. д. Это соглашение не применяется к исполняемым файлам.)

Имейте в виду, что UNIX (и UNIX-подобные системы) не являются Windows . MS Windows обычно использует расширение файла, чтобы определить, как его открыть/запустить. Двоичные исполняемые файлы должны иметь расширение .exe .. Если в Windows установлена ​​UNIX-подобная оболочка, вы можете настроить Windows для распознавания расширения .sh как сценария оболочки и использовать оболочку для его открытия; В Windows нет соглашения #! .


Вы не не нужно никакого расширения (или вы можете выбрать произвольное, но .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 ) имеют восхитительные и настраиваемые средства автозаполнения, и вам не придется много печатать (научитесь использовать вкладку на клавиатуре). Кроме того, скрипты и программы часто являются частями составных команд (конвейеров и т. Д.).

PS. Я использую Unix с 1986 года, а Linux с 1993 года. Я никогда не запускал свои собственные программы или сценарии, щелкая. Почему я должен?


Вам не нужно никакого расширения (или вы можете выбрать любое, но . sh — полезное соглашение).

Вы должны начать свой скрипт с #!/bin/bash (эта первая строка понимается execve ( 2) syscall), и вы должны сделать свой файл исполняемым с помощью 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 ) имеют восхитительные и настраиваемые средства автозаполнения, и вам не придется много печатать (научитесь использовать вкладку на клавиатуре). Кроме того, скрипты и программы часто являются частями составных команд (конвейеров и т. Д.).

PS. Я использую Unix с 1986 года, а Linux с 1993 года. Я никогда не запускал свои собственные программы или сценарии, щелкая. Почему я должен?


просто .sh .

Запустите сценарий следующим образом:

  ./script.sh  

РЕДАКТИРОВАТЬ: Как сказал Анубхава, расширение не на самом деле важно. Но по организационным причинам все же рекомендуется использовать расширения.


просто .sh .

Запустите сценарий следующим образом:

  ./script.sh  

РЕДАКТИРОВАТЬ: Как сказал анубхава, расширение не имеет значения. Но по организационным причинам все же рекомендуется использовать расширения.


Я знаю, что сейчас это довольно давно, но Я чувствую, что это добавляет к тому, о чем спрашивал вопрос.

Если вы используете Mac и хотите иметь возможность запускать скрипт, дважды щелкнув по нему, вам необходимо использовать расширение .command . Так же, как и раньше, сделайте файл исполняемым с помощью chmod -x .

Как было отмечено ранее, на самом деле это не так уж и полезно, tbh.


Я знаю, что это довольно давно сейчас, но я чувствую, что это добавляет к тому, о чем спрашивал вопрос.

Если у вас Mac и вы хотите иметь возможность запускать скрипт, дважды щелкнув его, вам нужно использовать расширение .command . Так же, как и раньше, сделайте файл исполняемым с помощью chmod -x .

Как было отмечено ранее, на самом деле это не так уж и полезно, tbh.


TL; DR — Если пользователь (не обязательно разработчик) скрипта использует графический интерфейс, это зависит от того, какой файловый браузер он использует. Finder MacOS потребует расширения .sh для выполнения скрипта. Gnome Nautilus, однако, распознает правильно оформленные скрипты с расширением .sh или без него.

Я знаю, что уже несколько раз говорилось о причинах и против использования extension в сценариях bash, но не столько, почему или почему не использовать расширения, но у меня есть то, что я считаю хорошим практическим правилом.

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

Если вы относитесь к тому типу людей, которые в первую очередь выполняют все или большую часть ваших работать в терминале, не беспокойтесь о том, чтобы добавлять какие-либо расширения в свои сценарии bash. В терминале они бесполезны, если вы уже настроили файл ~/.bashrc , чтобы визуально отличать скрипты от каталогов.

Изменить:

В браузере файлов Gnome Nautilus с 4 тестовыми файлами (каждый с разрешениями, предоставленными для файла, который должен быть запущен) с глупо простой командой bash, чтобы открыть окно терминала ( gnome-terminal ):

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

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

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

    Он работал при двойном щелчке по файлу.

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

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

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

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

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

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


TL; DR — Если пользователь (не обязательно разработчик) скрипта использует графический интерфейс, это зависит от того, какой файловый браузер он использует. Finder MacOS потребует расширения .sh для выполнения скрипта. Gnome Nautilus, однако, распознает правильно оформленные скрипты с расширением .sh или без него.

Я знаю, что уже несколько раз говорилось о причинах и против использования extension в сценариях bash, но не столько, почему или почему не использовать расширения, но у меня есть то, что я считаю хорошим практическим правилом.

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

Если вы относитесь к тому типу людей, которые в первую очередь выполняют все или большую часть ваших работать в терминале, не беспокойтесь о том, чтобы добавлять какие-либо расширения в свои сценарии bash. В терминале они бесполезны, если вы уже настроили файл ~/.bashrc , чтобы визуально отличать скрипты от каталогов.

Изменить:

В браузере файлов Gnome Nautilus с 4 тестовыми файлами (каждый с разрешениями, предоставленными для файла, который должен быть запущен) с глупо простой командой bash, чтобы открыть окно терминала ( gnome-terminal ):

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

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

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

    Он работал при двойном щелчке по файлу.

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

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

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

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

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

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

Оцените статью
techsly.ru
Добавить комментарий