Создание исполняемых файлов в Linux - PullRequest
41 голосов
/ 03 мая 2009

Одна вещь, которую я планирую сделать, - это писать (мучительно простые) сценарии Perl, и я хотел бы иметь возможность запускать их без явного вызова Perl из терминала. Я ценю, что для этого мне нужно предоставить им права на выполнение. Сделать это с помощью chmod достаточно легко, но это также кажется немного трудоемким дополнительным шагом. То, что я хотел бы, это одна из двух вещей:

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

В противном случае, есть ли способ объявить, что все файлы, созданные в определенном каталоге, должны иметь разрешения на выполнение?

Мой umask установлен на 022, что, насколько я понимаю, должно быть в порядке, но может показаться, что файлы создаются как текстовые файлы (с 666 разрешениями по умолчанию), а не как исполняемые файлы (с 777 разрешениями по умолчанию).

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

Ответы [ 5 ]

86 голосов
/ 03 мая 2009

Сделать файл исполняемым:

chmod + x file

Найти местоположение perl:

который perl

Это должно вернуть что-то вроде

/ bin / perl иногда / usr / local / bin

Затем в первой строке вашего скрипта добавьте:

#! "Путь" / perl с путем сверху, например

#! / Bin / Perl

Затем вы можете выполнить файл

. / Файл

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

6 голосов
/ 04 мая 2009

Нет необходимости взламывать ваш редактор или переключать редакторы.

Вместо этого мы можем придумать скрипт для просмотра ваших каталогов разработки и файлов chmod по мере их создания. Это то, что я сделал в прилагаемом скрипте bash. Возможно, вы захотите прочитать комментарии и отредактировать секцию 'config' в соответствии с вашими потребностями, тогда я бы предложил поместить ее в каталог $ HOME / bin / и добавить ее выполнение в ваш $ HOME / .login или подобный файл. Или вы можете просто запустить его из терминала.

Этот скрипт требует inotifywait, который входит в пакет inotify-tools в Ubuntu,

sudo apt-get install inotify-tools

Предложения / изменения / улучшения приветствуются.

#!/usr/bin/env bash

# --- usage --- #
# Depends: 'inotifywait' available in inotify-tools on Ubuntu
# 
# Edit the 'config' section below to reflect your working directory, WORK_DIR,
# and your watched directories, WATCH_DIR. Each directory in WATCH_DIR will
# be logged by inotify and this script will 'chmod +x' any new files created
# therein. If SUBDIRS is 'TRUE' this script will watch WATCH_DIRS recursively.
# I recommend adding this script to your $HOME/.login or similar to have it
# run whenever you log into a shell, eg 'echo "watchdirs.sh &" >> ~/.login'.
# This script will only allow one instance of itself to run at a time.

# --- config --- #

WORK_DIR="$HOME/path/to/devel" # top working directory (for cleanliness?)
WATCH_DIRS=" \
    $WORK_DIR/dirA \
    $WORK_DIR/dirC \
    "                          # list of directories to watch
SUBDIRS="TRUE"                 # watch subdirectories too
NOTIFY_ARGS="-e create -q"     # watch for create events, non-verbose


# --- script starts here --- #
# probably don't need to edit beyond this point

# kill all previous instances of myself
SCRIPT="bash.*`basename $0`"
MATCHES=`ps ax | egrep $SCRIPT | grep -v grep | awk '{print $1}' | grep -v $$`
kill $MATCHES >& /dev/null

# set recursive notifications (for subdirectories)
if [ "$SUBDIRS" = "TRUE" ] ; then
    RECURSE="-r"
else
    RECURSE=""
fi

while true ; do
    # grab an event
    EVENT=`inotifywait $RECURSE $NOTIFY_ARGS $WATCH_DIRS`

    # parse the event into DIR, TAGS, FILE
    OLDIFS=$IFS ; IFS=" " ; set -- $EVENT
    E_DIR=$1
    E_TAGS=$2
    E_FILE=$3
    IFS=$OLDIFS

    # skip if it's not a file event or already executable (unlikely)
    if [ ! -f "$E_DIR$E_FILE" ] || [ -x "$E_DIR$E_FILE" ] ; then
        continue
    fi

    # set file executable
    chmod +x $E_DIR$E_FILE
done
3 голосов
/ 03 мая 2009

То, что вы описываете, является правильным способом справиться с этим.

Вы сказали, что хотите остаться в GUI. Обычно вы можете установить бит выполнения через меню свойств файла. Вы также можете узнать, как создать настраиваемое действие для контекстного меню, чтобы сделать это для вас, если вы так склонны. Конечно, это зависит от среды вашего рабочего стола.

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

au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent !chmod +x <afile> | endif | endif
2 голосов
/ 03 мая 2009

Это действительно не так уж важно. Вы можете просто сделать скрипт с помощью одной команды:

chmod a+x *.pl

И запустить скрипт после создания perl-файла. Кроме того, вы можете открыть файл с помощью команды, подобной этой:

touch filename.pl && chmod a+x filename.pl && vi filename.pl # choose your favorite editor
0 голосов
/ 03 мая 2009

Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что, хотя вы можете установить свои собственные значения umask в системе, это не позволяет вам явно контролировать разрешения по умолчанию, установленные для нового файла, с помощью gedit (или любого другого редактора вы используете).

Я считаю, что эта деталь жестко запрограммирована в gedit и большинстве других редакторов. Варианты его изменения: (а) взломать ваш собственный мод gedit или (б) найти текстовый редактор, который позволяет вам устанавливать предпочтения для прав доступа по умолчанию для новых файлов. (Извините, я не знаю ни одного.)

В свете этого, на самом деле не так уж и плохо выполнять chmod ваши файлы, верно?

...