Расширения файлов для сценариев оболочки Unix [закрыто]

45

В википедии статья для .sh гласит:

Тип расширения файла .sh см. В оболочке Bourne .

Как насчет других оболочек Unix?

Я знаю, что шебанг используется внутри файла для обозначения интерпретатора для выполнения, но мне интересно:

  • Каковы плюсы и минусы расширений файлов по сравнению с расширениями файлов?
Амелио Васкес-Рейна
источник
4
Иногда можно найти сценарии оболочки без shebang (или без разрешений exec). В этом случае имя, оканчивающееся на .sh, может быть подсказкой пользователю для запуска их bash script.sh(или sh, конечно,).
Ансгар Эстерманн
3
Если сценарий оболочки имеет расширение, обычно это .sh. Я никогда не видел сценарий .ksh или .bash. Большинство сценариев оболочки не имеют расширения, как, например, все сценарии в /etc/init.d/*.
Ричард Холлоуэй
Хотя упрощенное заключение (да или нет) является мнением, вещи, которые следует учитывать, не являются.
Ctrl-Alt-Delor

Ответы:

35

Я бы назвал только .shто, что должно быть переносимым (и, надеюсь , переносимым).

В противном случае я думаю, что лучше просто спрятать язык. Внимательный читатель все равно найдет его в линии Шебанга. (На практике .bashили .zshи т. Д. Суффиксы используются редко.)

Стефан Хименес
источник
1
Только с этой страницы мы уже можем видеть довольно нетривиальное количество людей, использующих ее. Почему вы говорите, что они "редко используются"? Есть цитаты? Или это просто на основе вашего опыта?
Пейсер
23

Я бы сказал, что «хороших практик» для расширений файлов не существует, строго по техническим причинам: файловые системы Unix / Linux / * BSD сами по себе не поддерживают расширения. То, что вы называете расширением, является просто суффиксом одного имени файла. Это отличается от файловых систем и операционных систем VM / CMS, VMS, MS-DOS и Windows, где специальное место в морально-эквивалентном эквиваленте зарезервировано для расширения.

Эта маленькая напыщенная речь сейчас закончена, я думаю, что немного глупо ставить суффикс ".sh", ".ksh" или ".bash" в имени файла сценария оболочки. Программа - это программа: нет никакой выгоды в различении того, что исполняется. Ни Unix, ни Linux, ни ядро ​​не решили вызвать интерпретатор какого-либо файла только из-за суффикса имени файла. Все это делается #!строкой или какой-то другой последовательностью байтов "магического числа" в начале файла. Фактически, решение о том, что выполнять на основе имени файла с расширением, является одним из факторов, который делает Windows магнитом вредоносного ПО. Посмотрите, сколько мошеннических программ Windows использует файл с именем "thing.jpg.exe "- по умолчанию в более новых версиях Windows расширение" .exe "не отображается, и пользователю предлагается просто дважды щелкнуть"

То, что вы можете считать прямой командой, часто так или иначе является сценарием оболочки. Иногда ccэто был sh-скрипт, firefoxэто sh-скрипт, startxэто sh-скрипт. Я не верю, что для обозначения скрипта суффиксом «.sh» есть когнитивная или организационная выгода.

Брюс Эдигер
источник
24
Я не согласен! Моя работа состоит в том, чтобы упаковать приложение, включающее в себя тысячи файлов, начиная от двоичных исполняемых файлов и заканчивая скриптами оболочки (ksh, bash и некоторые устаревшие csh). Для меня, поверьте мне, действительно важно иметь возможность узнать с первого взгляда (или с помощью регулярных выражений), какой файл мы обсуждаем и ищем. Моя точка зрения заключается в том, что может быть полезно различать то, что оправдывается, и передовая практика должна поощрять явное указание типа файла.
Рахму
4
@rahmu: запиши это как ответ. Дайте некоторые подробности о том, как отличительные от regex имена помогают вам упаковывать (и, возможно, поддерживать) это приложение. Обратите особое внимание на взаимодействие между тем, что интерпретирует файл и суффикс имени файла, и тем, как это помогает вам в выполнении задач. Меня интересуют серьезные аргументы против моей точки зрения, и я готов измениться, если буду убежден. Я одобрил ваш комментарий, чтобы доказать это.
Брюс Эдигер
3
Я бы с удовольствием, к сожалению, я могу говорить только о моем нынешнем опыте работы. Я не знаю много о хорошей практике и стандартах в целом ; Я чувствую, что должен сделать некоторое исследование, прежде чем публиковать ответ здесь. Я посмотрю на это сегодня вечером после работы :)
rahmu
2
@rahmu Команда "file" существует для определения типа файла. Он способен различать сценарии, написанные для разных оболочек.
Мэтт
3
Если вы дадите сценарию оболочки .shрасширение, вы должны будете ввести его .shкак часть имени команды при его запуске. Это главная причина, почему я не люблю вставлять это расширение (то же самое, что и что-либо, имеющее линию Шебанга). Кстати, проблема в Windows заключается не в .exeпрефиксе как таковом ( image.jpgв конце концов, тривиально сделать исполняемый файл с именем в Linux), а в том, что Windows обычно скрывает это расширение, в сочетании с тем, что действие необходимо для запуска исполняемого файла и открыть документ точно так же.
celtschk
12

Как тот, кто работал во множестве сред nix, мне приходилось писать в самых разных оболочках. Верьте или нет, на разных платформах оболочки не одинаковы. Поэтому, если вы поддерживаете свою личную библиотеку в нескольких оболочках (когда это необходимо), очень полезно использовать расширения для идентификации оболочек. Таким образом, когда вы переходите на другую платформу, а оболочка немного отличается, вы знаете, какие сценарии нужно изменить. .ш .кш .бш .чш ...

Jumpylodo
источник
Похоже, это согласуется с unix.stackexchange.com/questions/31760/…
Pacerier,
У вас нет #!в начале сценария (например #!/bin/bash)?
Ctrl-Alt-Delor
Gnu / Linux, BSD и UNIX - это Unix. Нет необходимости для? Nix. Linux - это ядро, android использовал Linux, но не Unix (если только вы не добавили дополнительное программное обеспечение, в этом случае у вас есть приложение Unix).
Ctrl-Alt-Delor
@ ctrl-alt-delor: «Unix» является товарным знаком . Люди часто используют «nix», чтобы избежать проблемы с товарным знаком (и педантами).
JS.
@JS `UNIX 'является товарным знаком The Open Group. Unix и unix не являются greens.org/about/unix.html
ctrl-alt-delor
6

Не следует использовать расширение для исполняемых файлов, так как они не являются взаимозаменяемыми. Представьте, что у вас есть сценарий оболочки a.sh, а затем переписать на python a.py, теперь вам нужно изменить каждую программу, которая вызывает ваш сценарий, у вас утечка деталей реализации.

Все, что связано с расширением имени файла в Windows Mircosoft, - это беспорядок: например, что могло бы быть a.audio, b.audio, c.audio, есть a.mp3, b.wav, c.oggи d.picture, e.picture, f.pictureесть d.jpeg, e.png, f.gif. Большую часть времени нам не важно, в каком формате находится аудио или картинка. Нам также придется потратить много времени на обучение новых пользователей всем расширениям файлов.

Ctrl-Alt-Делор
источник
Еще одна причина не использовать *.shя побежал в том , что устроено в Debian run-partsне будет запускать скрипты с расширениями, например, в /etc/cron.*/: archive.oreilly.com/pub/post/runparts_scripts_a_note_about.html
Росс Паттерсон
5

Как вы сказали, расширения файлов Unix являются исключительно информацией. Вам просто нужен ваш скрипт, чтобы иметь правильный shebang и быть исполняемым.

Вы можете не иметь расширения или использовать .sh.

Я лично использую следующие соглашения, независимо от используемой оболочки (csh, tcsh, bash, sh, ...):

  • нет расширения для системных или высококачественных скриптов (крайне редко).
  • .shдля классических сценариев, от низкого до высокого класса.
Ouki
источник
Что вы подразумеваете под "классическими сценариями, от низкого до высокого уровня"?
Пейсер
Я думаю, что я имел в виду уровень абстракции или организации. То есть вас не волнует, какой язык / инструмент-скрипт используется в некоторых командах: поэтому вы не используете никаких расширений. Для других полезно знать, что это bash или какой-нибудь экзотический скрипт оболочки ksh (с соответствующим расширением). ... но это было 2 года назад;)
Ouki
3

Расширения сценариев оболочки весьма полезны. Например, я часто пишу сценарии, которые имеют несколько файлов на нескольких языках (например, bash, awk и lua) в одном каталоге. Если мне нужно искать строку только в файлах bash, расширение делает это очень удобным, чтобы уменьшить количество ложных срабатываний. Или, если я хочу сделать подсчет строк всего моего кода Bash для этого проекта.

Больно вводить расширение при запуске программы, поэтому я также делаю символическую ссылку без расширения на основной исполняемый файл, чтобы редактировать / запускать его без необходимости каждый раз вводить расширение. Симлинки дешевы и просты.

Стив
источник
Похоже, это согласуется с unix.stackexchange.com/questions/31760/…
Pacerier
2

Как уже говорили другие, оболочка не заботится о расширениях. Тем не менее, он позволяет быстро идентифицировать файлы. Я вижу файлы, оканчивающиеся на .pyили, .shи я быстро знаю, какими они (по крайней мере) должны быть. Как говорит Стив, поиск по расширению файла или подсчет строк также являются практическими соображениями.

qwr
источник