.sh с указанием расширения?

Самое большое, что я нашел, это

\rm file

, это запустит исходную версию unalias и сохранит псевдоним.

Мы также можем использовать встроенную оболочку command например,

command rm file

, но я, безусловно, наслаждаюсь меньшей детализацией в первом

1
задан 13 April 2017 в 15:24

4 ответа

Ключевым моментом является следующее: расширения не имеют отношения к какой-либо Unix-подобной системной системе. Имя файла - это просто имя и не влияет на возможность запуска сценария или скомпилированного исполняемого файла. Программист может добавить расширение .sh, чтобы указать, что файл является сценарием оболочки или .py для сценария python, но в отличие от Windows любой unix не заботится об именах, он заботится о разрешениях.

[d2 ] Важно то, что исполняемый файл предоставлен файлу. Вы можете проверить с помощью

ls -l /path/to/file

Запуск исполняемых файлов

Для запуска сценария обычно существует несколько способов.

Если ваш текущий каталог совпадает с сценарием , а сценарий имеет исполняемые разрешения, вы можете запустить его так ./my_script_name. [F10] означает текущий каталог. Если ваш текущий каталог отличается, а скрипт имеет исполняемые разрешения, вы можете запустить его, указав полный путь: /home/user/bin/my_script_name

(Два вышеуказанных метода полагаются на установленный набор разрешений, независимо от того, является ли файл частью $PATH не имеет значения. Наличие строки #! также имеет значение, без нее скрипт будет выполняться текущей оболочкой, которую вы открыли. Если у меня есть csh скрипт без этой строки и попробуйте запустить его в bash с ./my_script.csh, он не сработает)

Если ваш текущий каталог совпадает с сценарием, а скрипт имеет исполняемые разрешения, вы можете запустить его так ./my_script_name. [F10] означает текущий каталог. Задание интерпретатора как команды и скрипта в качестве аргумента. Таким образом, скрипт будет служить входным файлом для интерпретатора. Если ваш текущий каталог отличается, а сценарий имеет исполняемые разрешения, вы можете запустить его, указав полный путь: /home/user/bin/my_script_name

Примеры

Пример # 1, работа с интерпретатором, разрешения exec

$-> ls -l abc.py                                                               
-rw-rw-r-- 1 xieerqi xieerqi 44 Apr 27 22:39 abc.py
$-> python abc.py                                                              
a
b
c

Пример # 2, работающий с установленным набором разрешений ./, набор строк shebang.

$-> cat abc.py                                                                 
#!/usr/bin/env python
for letter in 'a' 'b' 'c' :
   print letter
$-> ls -l abc.py
-rwxrwxr-x 1 xieerqi xieerqi 66 Apr 27 23:02 abc.py*
$-> ./abc.py                                                                   
a
b
c

Пример №3, работающий без shebang line set (fail, потому что bash не может читать скрипты python, ни одна строка shebang не принимает текущую оболочку в качестве интерпретатора)

$-> cat abc.py                                                                 
for letter in 'a' 'b' 'c' :
   print letter
$-> ./abc.py                                                                   
./abc.py: 2: ./abc.py: Syntax error: word unexpected (expecting "do")

Пример # 4, запущенный скрипт, который имеет исполняемые разрешения, устанавливает папку формы, которая является частью из $PATH переменной

#  /home/xieerqi/bin is part of my path variable
$-> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/microchip/xc16/v1.25/bin:/opt/microchip/xc32/v1.40/bin:/opt/microchip/xc8/v1.35/bin:/home/xieerqi/bin:/home/xieerqi/bin/sh

$-> # current directory is /home/xieerqi
$-> pwd
/home/xieerqi
$-> # move the file to ~/bin
$-> mv ~/abc.py ~/bin/abc.py
$-> # now I can run it just by calling the name
$-> abc.py
/home/xieerqi/bin/abc.py: 2: /home/xieerqi/bin/abc.py: Syntax error: word unexpected (expecting "do")
$-> # Syntax error because again, no interpreter specified.                    
$-> # must add #!/usr/bin/env python
$-> vi /home/xieerqi/bin/abc.py          
$-> # after adding the line with vi text editor, we can run
$-> abc.py                                                                     
a
b
c

Пример # 5, удаляя расширение, по-прежнему выполняется, потому что расширения не имеют значения, но он имеет разрешения и является частью $PATH:

$-> mv ~/bin/abc.py  ~/bin/abc                                                 
$-> abc
a
b
c
12
ответ дан 23 May 2018 в 11:40
  • 1
    Я выполнил команду, и я получил это «-rwxr-x ---». Что я хочу, чтобы значение читалось и как я могу его изменить? – Philip Kirkbride 28 April 2016 в 07:39
  • 2
    Или вы говорите, что я должен просто переименовать 'filename.sh' в 'filename'? – Philip Kirkbride 28 April 2016 в 07:42
  • 3
    Имя @PhilipKirkbride не имеет значения. Как вы выполняете свою команду? Где это ? Является ли каталог частью вашего PATH? – Sergiy Kolodyazhnyy 28 April 2016 в 07:43
  • 4
    @PhilipKirkbride Позвольте мне расширить свой ответ за минуту, чтобы сделать его более ясным. – Sergiy Kolodyazhnyy 28 April 2016 в 07:44
  • 5
    Взгляните на man chmod, чтобы узнать, как устанавливать разрешения – Nicholas Mertin 28 April 2016 в 16:24

Хорошие объяснения здесь уже. Я просто хотел добавить, что в идеале вы не должны использовать расширения файлов для исполняемых файлов.

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

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

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

Если ваш скрипт был назван do-something.sh, он может продолжать быть do-something.sh, но теперь он написан на python (например) и поэтому ваш первоначальный намек теперь полностью вводит в заблуждение.

6
ответ дан 23 May 2018 в 11:40

Чтобы запускать файлы без расширения, вам обычно не нужно много делать, просто убедитесь, что у вас есть (в случае скриптов bash) правильная строка shebang в самой первой строке:

#!/bin/bash

then вам также необходимо сделать файл исполняемым для системы с помощью

chmod 755 yourfilename

Это то же самое, что и при использовании chmod +x yourfilename номера легко объясняются.

Это число тройка добавлены восьмеричные, первое число - для пользователя, второе - для группы, а третье - для других, более того, что вы можете найти здесь.

И если вы находитесь в том же каталоге, script не забудьте использовать ./ следующим образом:

./yourfilename
4
ответ дан 23 May 2018 в 11:40
  • 1
    Пробовал это. К сожалению, нет никакой разницы с оригинальными результатами. – Philip Kirkbride 28 April 2016 в 07:33
  • 2
    @PhilipKirkbride взгляните на мой пересмотренный ответ, это, вероятно, прольет еще немного света. – Videonauth 28 April 2016 в 07:35

. Суффикс .sh может действительно мешать, потому что тогда для его запуска вам нужно ввести myscript.sh вместо просто myscript, который не будет работать. Лучше просто называть его «myscript» без суффикса .sh, и быстрое использование команды «file» скажет вам, является ли это двоичным исполняемым файлом (формат ELF на linux) или скриптом оболочки или любым другим типом скрипта.

QDOS (быстрая и грязная операционная система, позже переименованная в «DOS» IBM после того, как mirosoft пиратствовала и незаконно продала ее им) и другие дешевые риппоты CP / M, включая окна, смешивают все это потому что в этих системах нет таких прав, как разрешения на выполнение для файлов. Это привело к бесчисленным нарушениям безопасности за последние 30-40 лет. На самом деле всего несколько минут назад у меня появилось несколько нежелательных писем с замаскированным zip-файлом, переименованным в MYPICTURE.JPG.zip:)

0
ответ дан 23 May 2018 в 11:40

Другие вопросы по тегам:

Похожие вопросы: