web-dev-qa-db-fra.com

Création de fichiers exécutables sous Linux

Une chose que je prévois de faire est d’écrire (avec une extrême simplicité) les scripts Perl, et j’aimerais pouvoir les exécuter sans appeler explicitement Perl depuis le terminal. J'apprécie que, pour ce faire, je dois leur accorder des autorisations d'exécution. Faire cela avec chmod est assez facile, mais cela semble aussi être une étape supplémentaire légèrement laborieuse. Ce que j'aimerais, c'est l'une des deux choses suivantes:

Premièrement, existe-t-il un moyen de définir l'indicateur d'exécution lors de la sauvegarde d'un fichier? Actuellement, j'expérimente avec gedit et geany, mais je serais prêt à passer à un éditeur similaire (ou mieux) si il avait cette capacité.

En cas d'échec, existe-t-il un moyen de déclarer que tous les fichiers créés dans un répertoire particulier doivent avoir des autorisations d'exécution?

Mon umask est défini sur 022, ce qui devrait être OK, mais je dirais que les fichiers sont créés sous forme de fichiers texte (avec 666 autorisations par défaut) plutôt que de fichiers exécutables (avec 777 autorisations par défaut).

Je suis peut-être simplement paresseux, mais je pense qu'il doit exister un moyen plus pratique que de modifier chaque script créé.

41
user100246

Rendre le fichier exécutable:

chmod + x fichier

Trouver l'emplacement de Perl:

quel Perl

Cela devrait retourner quelque chose comme

/ bin/Perl parfois/usr/local/bin

Ensuite, dans la première ligne de votre script, ajoutez:

#! "path"/Perl avec le chemin d'en haut, par exemple.

#!/bin/Perl

Ensuite, vous pouvez exécuter le fichier

./fichier

Il peut y avoir des problèmes avec PATH, alors vous voudrez peut-être aussi changer cela ...

86
user735

Pas besoin de pirater votre éditeur, ni de changer d'éditeur.

Au lieu de cela, nous pouvons créer un script pour surveiller vos répertoires de développement et vos fichiers chmod au fur et à mesure de leur création. C'est ce que j'ai fait dans le script bash ci-joint. Vous voudrez probablement lire les commentaires et éditer la section 'config' selon vos besoins, alors je vous suggère de la mettre dans votre répertoire $ HOME/bin/et d'ajouter son exécution à votre fichier $ HOME/.login ou similaire. Ou vous pouvez simplement l'exécuter depuis le terminal.

Ce script nécessite inotifywait, qui est inclus dans le package inotify-tools sur Ubuntu,

Sudo apt-get install inotify-tools

Les suggestions/modifications/améliorations sont les bienvenues.

#!/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
6
Dylan

Ce que vous décrivez est la bonne façon de gérer cela.

Vous avez dit que vous voulez rester dans l'interface graphique. Vous pouvez généralement définir le bit d'exécution via le menu des propriétés du fichier. Vous pouvez également apprendre à créer une action personnalisée pour le menu contextuel afin de le faire pour vous si vous le souhaitez. Cela dépend de votre environnement de bureau bien sûr.

Si vous utilisez un éditeur plus avancé, vous pouvez créer un script pour que l'action se produise lors de la sauvegarde du fichier. Par exemple (je ne connais que très bien vim), vous pouvez ajouter ceci à votre fichier .vimrc pour créer un nouveau fichier commençant par "#!/*/bin/* "exécutable.

au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent !chmod +x <afile> | endif | endif
3
JimB

Ce n'est vraiment pas un gros problème. Vous pouvez juste faire un script avec la commande unique:

chmod a+x *.pl

Et lancez le script après avoir créé un fichier Perl. Vous pouvez également ouvrir un fichier avec une commande comme celle-ci:

touch filename.pl && chmod a+x filename.pl && vi filename.pl # choose your favorite editor
2
BobbyShaftoe

Je pense que le problème que vous rencontrez est que, même si vous pouvez définir vos propres valeurs umask dans le système, cela ne vous permet pas de contrôler explicitement les autorisations par défaut définies sur un nouveau fichier par gedit (ou quel que soit l'éditeur que vous utilisez). .

Je crois que ce détail est codé en dur dans gedit et la plupart des autres éditeurs. Vos options pour le changer sont (a) le piratage de votre propre mod de gedit ou (b) la recherche d'un éditeur de texte vous permettant de définir une préférence pour les permissions par défaut sur les nouveaux fichiers. (Désolé, je n'en connais aucun.)

À la lumière de cela, ce n’est vraiment pas si mal d’avoir à modifier vos fichiers, pas vrai?

0
grossvogel