1

Часть 1 Итак, я использую Mac, и я начал с файла под названием ...

Пример: myFile.sh

В Терминале я запустил этот файл в своем каталоге, набрав ...

bash myFile.sh

Это прекрасно работает, но потом я провел некоторое исследование о bash против sh и обнаружил, что мог бы также написать это так ...

sh myFile.sh

Это также сработало. Я провел еще несколько исследований, и мне пришла в голову мысль, что, поскольку bash - это "новый" способ сделать что-то, я подумал, что попытаюсь переименовать myFile.sh в myFile.bash чтобы посмотреть, будет ли он по-прежнему работать в терминале, если я набрал это ...

bash myFile.bash

И это сработало отлично! Но теперь мне интересно, есть ли причина, по которой файл изначально назывался myFile.sh вместо myFile.bash

Итак, плохо ли, что я переименовал его в myFile.bash вместо myFile.sh? Или это совершенно нормально?

(Я новичок в терминальных командах)

ЧАСТЬ 2

Другой вопрос: как бы я сделал этот исполняемый файл "myFile.sh"? Это содержимое myFile.sh ниже:

#!/bin/bash 
python runtime/recompile.py "$@"

ПРИМЕЧАНИЕ. Я провел некоторое исследование и попытался переименовать myFile.sh в myFile.command, что должно сделать его исполняемым при открытии файла, но это не сработало, и я получил эту ошибку в Terminal:

python: can't open file 'runtime/recompile.py': [Errno 2] No such file or directory

Так что мои вопросы действительно таковы:

а) Как мне сделать исполняемый файл myFile.sh в терминале? б) Почему не переименовали myFile.sh в myFile.command?

Любая помощь приветствуется.

3 ответа3

3

Это нормально, он будет работать с различными расширениями, а также без расширения. Расширения файлов не имеют смысла в Unix (ссылка: http://developers.sun.com/solaris/articles/korn_shell.html). Расширения полезны для людей, чтобы быстро идентифицировать файлы.

Возможно, вам следует использовать расширение .sh как оно более популярно и короче, чем .bash .

3

Вероятно, вы должны сделать эти файлы исполняемыми с помощью chmod +x filename и указать интерпретатор скрипта в первой строке (shebang):

#!/bin/bash

Или, чтобы уважать $PATH:

#!/usr/bin/env bash

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

#!/bin/bash --login

Использование собственного расширения файла, такого как .bash может нарушить неочевидные процессы, такие как передача файлов по FTP, если вы также используете системы Windows: многие программы FTP обрабатывают файлы с определенными расширениями как текст, изменяя окончания строк. Если вы используете нестандартные расширения файлов для своих сценариев, этого не произойдет, и символы \r (возврат каретки) из Windows будут сохранены.


Ваше переименование в .command вероятно, не работает, так как ваш рабочий каталог изменился вместе с тем, как вы выполняете свой файл. Он всегда будет выполняться в $HOME , например, /Users/danielbeck , и относительные пути должны начинаться с него. Безопаснее обеспечить абсолютный путь.


Если вам не требуется окно терминала для выполнения программы, вы также можете использовать Automator и его действие Run Shell Script для создания приложения или службы, последнее с необязательным сочетанием клавиш в Системных настройках »Клавиатура» Сочетания клавиш »Службы.

Вам необходимо настроить службу для приема файлов и папок в любом приложении в качестве входных данных и запускать ее при выборе файлов; если это приложение, вы можете перетаскивать на него файлы. В любом случае настройте действие « Выполнить сценарий оболочки» для получения входных данных в качестве аргументов.

1

Первая строка исполняемого сценария оболочки должна быть « шебанг »; #! sequence - это "магическое число", которое сообщает системе, что в оставшейся части строки указан интерпретатор, которому он передаст имя вашего скрипта.

Например, если у вас есть файл с именем "foo" (без суффикса), который выглядит следующим образом:

#!/bin/sh

echo This is foo

и вы запустили chmod +x foo (это важно!), тогда это:

./foo

эквивалентно этому:

/bin/sh ./foo

и будет выдавать вывод This is foo .

Например, вы можете вызвать скрипт foo.sh , если хотите подчеркнуть, что это скрипт оболочки, но в этом нет необходимости. (Обычно для пользователя нет причин заботиться о том, как он реализован; в этом случае вы можете просто назвать его foo , который может быть сценарием оболочки, сценарием Perl или Python или скомпилированным исполняемым файлом.)

Так в чем же разница между #!/bin/sh и #!/bin/bash? Для большинства целей они взаимозаменяемы. /bin/sh - это обычно Bourne Shell, которая восходит к ранним временам Unix; вы найдете его версии на всех Unix-подобных системах, включая Linux и MacOS. /bin/bash - это GNU «Bourne-Again Shell», которая включает стандартную функциональность оболочки Bourne плюс ряд расширений.

Если вы используете только те функции, которые поддерживаются оболочкой Bourne, вероятно, лучше использовать #!/bin/sh просто вопрос стиля, чтобы повысить вероятность того, что ваш скрипт будет работать без изменений в других системах (на которых может не быть установлен Bash).

Если вы используете специфичные для Bash функции, вам нужно использовать #!/bin/bash .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .