Я видел много ответов на этот вопрос, но ни один не работает сейчас.

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

Я должен использовать что-то вроде

chmod 755 <script.sh>

каждый раз, когда я создаю новый скрипт

Я пытался подать заявку

chmod g+rwxs <directory>

в родительском каталоге, но он не работает. Любые решения?

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

2 ответа2

1

Во-первых, ИМХО, система разрешений существует для вашей защиты, и лучше всего научиться любить. Если, однако, вы действительно хотите победить, вот как. Откройте какой-нибудь терминал и выполните команду:

inotifywait -m "$HOME/bin" -e close_write -e moved_to --format '%w%f' | while read -r fname; do chmod +x "$fname"; done

Или для тех, кто предпочитает, чтобы их команды распределялись по нескольким строкам:

inotifywait -m "$HOME/bin" -e close_write -e moved_to --format '%w%f' |
   while read -r fname
   do
       chmod +x "$fname"
   done

Эта команда добавит разрешение на выполнение для каждого файла, созданного или перемещенного в каталог $HOME/bin (или любой другой каталог, который вы выберете).

Если в вашей системе еще не установлен inotifywait , вам может потребоваться установить его с помощью команды:

apt-get install inotify-tools

Как это устроено

  • inotifywait -m "$HOME/bin" -e close_write -e moved_to --format '%w%f'

    Эта команда просматривает каталог $HOME/bin . Каждый раз, когда файл перемещается в этот каталог (moved_to) или записывается и закрывается в этом каталоге (close_write), команда записывает путь и имя файла в стандартный вывод.

    (Недостатком здесь является то, что inotifywait не поддерживает разделенный NUL вывод. Следовательно, этот скрипт не будет работать, если имя вашего файла содержит символы новой строки.)

  • |

    Это приводит к запуску конвейера , который отправляет стандартный вывод inotifywait на стандартный вывод следующей команды.

  • while read -r fname; do

    Это запускает цикл, который читает строки из stdin и присваивает их переменной fname .

  • chmod +x "$fname"

    Это добавляет бит выполнения в файл $fname . Если вы хотите, чтобы другие пользователи в вашей системе могли запускать команды, вы можете изменить это на chmod a+x "$fname" . Или вы можете изменить это на chmod 755 "$fname" если вы действительно этого хотите.

  • done

    Это сигнализирует об окончании цикла.

1

Вы можете выполнить скрипт, используя

bash <the script> <args> <to> <the> <script>

или даже если вы уже используете bash и не возражаете против постоянных переменных:

. <the script> <args> <to> <the> <script>`

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

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