2

Я чувствую себя более комфортно с терминалом в Mac OSX, и я подумал, что мне придется побаловаться со сценариями bash. Не желая ползти, прежде чем я смог сесть, я хотел написать невероятно простой «Привет, мир!Сценарий, поэтому я сделал это:

~/Desktop touch hello.sh
~/Desktop vim hello.sh

Затем я добавил это в hello.sh

#!/bin/bash
echo "Hello, world!"

Затем я сделал это:

~/Desktop chmod -x hello.sh
~/Desktop hello

В этот момент ничего не произошло.

Я скачал такой же простой bash-скрипт откуда-то, который был таким:

#!/bin/bash
echo "The current date and time."
date

И когда я сделал

~/Desktop date

он сделал именно то, что должен был.

Затем я проверил права доступа к файлу с помощью ls -l и получил следующее:

-rw-r--r--    1 Mike  staff       33  5 Sep 21:13 hello.sh
-rw-r--r--@   1 Mike  staff       50  5 Sep 21:00 date.sh

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

Итак, мои вопросы: почему это не работает, что я делаю не так? А что такое @ в конце разрешений?

1 ответ1

8

Во-первых, вы должны добавить бит разрешения "выполнить". Использование chmod +x добавляет его, chmod -x удаляет его.

Во-вторых, в Unix вы должны использовать точное имя файла. Если файл называется hello.sh , вы должны запустить его с помощью hello.sh , а не hello . (Вероятно, вы привыкли к Windows и ее% PATHEXT%, которой нет в Unix. Здесь рассматривается только бит выполнения, а .sh для системы не имеет смысла - файл можно назвать просто hello если хотите.)

В-третьих, по умолчанию в текущем каталоге не выполняется поиск команд (по соображениям безопасности). Либо скрипт должен находиться в вашем $ PATH, либо вы должны запускать его по полному пути. Использование . (что означает "текущий каталог") будет достаточно.

~/Desktop chmod +x hello.sh
~/Desktop ./hello.sh
Hello, world!
~/Desktop ~/Desktop/hello.sh
Hello, world!
~/Desktop

(./hello.sh означает « hello.sh в текущем каталоге».)

Когда вы ввели date , вы не запустили свой собственный скрипт; вы запустили системную команду date (так же, как вы запускаете системную команду chmod при chmod). @ Не имеет значения здесь.

Символ @ просто указывает на наличие "расширенных метаданных", связанных с этим файлом; скорее всего что-то конкретное для TextEdit. Согласно странице справочника ls (1) , вы можете использовать ls -l -@ (ls -l@) для просмотра метаданных.

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