2009-05-03 9 views
37

Une chose que je prévois de faire est d'écrire des scripts Perl (péniblement simples), 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 une étape supplémentaire un peu laborieuse. Qu'est-ce que je voudrais est l'une des deux choses:Création de fichiers exécutables sous Linux

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

A défaut, est-il possible de déclarer que tous les fichiers créés dans un répertoire particulier devraient avoir des permissions d'exécution? Mon umask est réglé sur 022, ce qui devrait être OK, si je comprends bien, mais il semblerait que les fichiers sont créés en tant que fichiers texte (avec 666 autorisations par défaut) plutôt que des fichiers exécutables (avec 777 autorisations par défaut) . Peut-être que je suis simplement paresseux, mais je pense qu'il doit y avoir un moyen plus pratique que de chmodding chaque script que l'on crée.

+0

Vous devez imprimer la sortie de chaque fichier. Vous devez importer les bonnes bibliothèques de chaque fichier. Cela semble être une autre étape dans le processus de programmation, et il est dangereux de la contourner. – JFA

Répondre

2

Ce n'est vraiment pas un gros problème. Vous pouvez simplement créer un script avec la commande unique:

chmod a+x *.pl 

Exécutez le script après avoir créé un fichier perl. Sinon, vous pouvez ouvrir un fichier avec une commande comme ceci:

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

J'étais plus à la recherche d'un moyen de tout faire dans l'interface graphique, mais peut-être que ce n'est pas possible. Est-ce une chose de sécurité? –

+0

oui, c'est une chose de sécurité. Cela pourrait être un gros problème si le shell commençait à créer tout ce qui était exécutable par défaut. – JimB

+0

Vous pourriez faire un programme simple qui fait cela pour vous. Mais honnêtement, vous essayeriez de faire quelque chose que personne d'autre qui programme dans un environnement UNIX ne fait vraiment. – BobbyShaftoe

80

Marque fichier exécutable:

chmod + x fichier

Recherche emplacement de Perl:

qui perl

Cela devrait retourner quelque chose comme

/bin/perl parfois/usr/local/bin

Puis dans la première ligne de votre script ajouter:

# "chemin "/ perl avec le chemin d'en haut

#!/Bin/perl

Ensuite, vous pouvez exécuter le fichier

./file

Il peut y avoir quelques problèmes avec le PATH, vous voudrez peut-être pour changer cela aussi ...

+0

Merci, mais ce n'est pas tout à fait mon problème. J'ai déjà pris l'habitude de démarrer mes scripts aveC#!/Usr/bin/perl. Je peux exécuter des scripts correctement une fois que je leur ai donné des permissions exécutables; Je cherchais simplement une façon plus simple de le faire. –

+11

Puis-je recommander '#!/Usr/bin/env perl' à la place? Le programme 'env' trouve essentiellement l'argument donné (dans ce cas," perl ") sur le PATH et l'exécute. C'est utile lorsque vous envoyez des scripts à d'autres personnes - par exemple, j'utilise un Mac, et Perl se trouve dans/opt/local/bin. –

3

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 bien sûr de votre environnement de bureau.

Si vous utilisez un éditeur plus avancé, vous pouvez programmer l'action pour que le fichier soit enregistré. Par exemple (je ne suis vraiment familier avec vim), vous pouvez ajouter ceci à votre .vimrc pour faire tout nouveau fichier qui commence par "#!/*/bin/*" exécutable.

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

En utilisant cette astuce, je suis tombé sur le problème mentionné ici: https://bbs.archlinux.org/viewtopic.php?id=126304 Donc maintenant j'utilise la version légèrement modifiée 'autocmd BufWritePost * si getline (1) = ~ "^ #!/bin /" | exécution silencieuse "! chmod a + x " | endif' – Gautam

0

Je pense que le problème que vous utilisez en 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) pirater votre propre mod de gedit ou (b) trouver un éditeur de texte qui vous permet de définir une préférence pour les autorisations par défaut sur les nouveaux fichiers. (Désolé, je n'en connais aucun.)

En conséquence, il n'est vraiment pas si mal d'avoir à chmod vos fichiers, non?

5

Pas besoin de pirater votre éditeur ou de changer d'éditeur. A la place, nous pouvons créer un script pour regarder 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 voulez probablement lire les commentaires et éditer la section 'config' selon vos besoins, alors je vous suggère de le placer 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 à partir du terminal.

Ce script ne nécessite inotifywait, qui vient dans le paquet inotify-tools sur Ubuntu,

sudo apt-get install inotify-tools 

Suggestions/modifications/améliorations sont les bienvenus.

#!/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 
+0

Ne serait-il pas plus simple de définir un umask sur le répertoire? –

Questions connexes