Перейменування файлу з myFile.sh на myFile.bash?


1

ЧАСТИНА 1 Добре, тому я використовую Mac, і я почав з файлу під назвою ...

Приклад: myFile.sh

У Терміналі я запустив цей файл у його каталог, ввівши ...

bash myFile.sh

Це прекрасно працює, але потім я провів деякі дослідження щодо bash vs sh і виявив, що я міг би також написати це так ...

sh myFile.sh

Це теж спрацювало. Я зробив деякі додаткові дослідження і ідея прийшла в голову, що , так як баш це «новий» спосіб зробити це, я думав , що я хотів би спробувати перейменувати , 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

Тож мої запитання справді такі:

a) Як зробити так, щоб myFile.sh виконувався у Terminal? b) Чому не перейменували myFile.sh на myFile.command?

Будь-яка допомога вдячна.


1
can't open fileПовідомлення означає просто , що runtime/recompile.pyне існує. Це не має нічого спільного з назвою вашого myFile.whateverсценарію. Але вам, мабуть, взагалі не потрібен сценарій оболонки; просто переконайтеся, що ваш скрипт Python має #!/usr/bin/python, запустіть chmod +xйого та запустіть його безпосередньо.
Кіт Томпсон

Відповіді:


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, щоб отримувати введення як аргументи .


Так, зробити його виконуваним буде набагато швидше, ніж набирати текст. Тепер, якщо я зроблю його виконуваним, чи це означає, що я можу просто двічі клацнути файл і він буде працювати? Ось код всередині "myFile.sh": #! / Bin / bash python runtime / rekompile.py "$ @" (його для моделювання minecraft) у Терміналі, що я б набрав, щоб зробити його виконуваним? ПРИМІТКА: Я спробував перейменувати розширення з .sh на .command (він не виконувався, коли клацнув подвійним клацанням, сталася помилка), також було б краще перетворити його на .app дещо як ?? - або це буде безглуздо, оскільки зробити його виконуваним зробить те ж саме *
Яків

@Jake Будь ласка, відредагуйте своє запитання або опублікуйте нове, щоб ви насправді запитали, що ви хочете виконати. Здається, це класична проблема XY . Напевно, вам не потрібен ні сценарій bash, ні виконуваний файл, який запускає python. Повідомте мене, як тільки ви це зробите, коментуючи тут, щоб я міг розмістити відповідь.
Даніель Бек

Гаразд, я зробив частину 2 свого питання вище.
Яків

@Jake "Багатоповерхові" запитання, як правило, нахмурені, оскільки ви схильні надсилати нас на гусячу погоню, і важко визначити, який користувач насправді відповів на ваше запитання. Корисність для інших, хто шукає відповідь на подібне питання, також дуже обмежена.
Даніель Бек

1

Перший рядок виконуваного сценарію оболонки повинен бути " шебангом "; #!послідовність являє собою «магічне число» , яка повідомляє системі , що інша частина рядка задає інтерпретатор , до якого він буде передавати ім'я вашого скрипта.

Наприклад, якщо у вас є файл з назвою "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як правило, оболонка Борна, яка сягає перших днів Unix; ви знайдете його версії в усіх системах, схожих на Unix, включаючи Linux та MacOS. /bin/bashє GNU "Bourne-Again Shell", що включає стандартну функцію оболонки Bourne плюс ряд розширень.

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

Якщо ви використовуєте функції Bash, вам потрібно буде скористатися #!/bin/bash.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.