2009-05-03 12 views
37

Una cosa que planeo hacer es escribir (dolorosamente simple) scripts de Perl, y me gustaría ser capaz de ejecutarlos sin llamar explícitamente a Perl desde la terminal. Aprecio que, para hacer esto, necesito otorgarles permisos de ejecución. Hacer esto con chmod es bastante fácil, pero también parece un paso extra un poco laborioso. Lo que me gustaría es una de estas dos cosas:Creando archivos ejecutables en Linux

En primer lugar, ¿hay alguna forma de establecer el indicador de ejecución al guardar un archivo? Actualmente estoy experimentando con gedit y geany, pero estaría dispuesto a cambiar a un editor de características similares (o mejores) si tuviera esta capacidad.

En su defecto, ¿hay alguna manera de declarar que todos los archivos creados en un directorio particular deberían tener permisos de ejecución?

Mi máscara de usuario se establece en 022, que debería estar bien, por lo que yo entiendo, pero parece que los archivos se crean como archivos de texto (con 666 permisos por defecto) en lugar de archivos ejecutables (con 777 permisos por defecto) .

Tal vez estoy siendo perezoso, pero me imagino que debe haber una manera más conveniente que chmodding cada script que uno crea.

+0

Debe imprimir la salida de cada archivo. Tienes que importar las bibliotecas correctas de cada archivo. Esto parece un paso más en el proceso de programación, y uno que es peligroso eludir. – JFA

Respuesta

2

Realmente no es tan importante. Se podía hacer un script con el comando individual:

chmod a+x *.pl 

y ejecutar el script después de crear un archivo Perl. Como alternativa, puede abrir un archivo con un comando como este:

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

Estaba buscando más una manera de hacer todo en la GUI, pero quizás esto no sea posible. ¿Es algo de seguridad? –

+0

sí, es una cuestión de seguridad. Podría ser un gran problema si el shell comenzara a crear todo ejecutable por defecto. – JimB

+0

Puede hacer un programa simple que lo haga por usted. Pero, sinceramente, estarás intentando hacer algo que nadie más que programe en un entorno UNIX realmente lo hace. – BobbyShaftoe

80

hacer el archivo ejecutable:

chmod + x archivo de

encontrar la ubicación de Perl:

que perl

Esto debería devolver algo así como

/bin/perl veces/usr/local/bin

Luego, en la primera línea del script añadir: ruta

# "! "/ perl con ruta desde arriba, por ejemplo

#!/Bin/perl

A continuación, puede ejecutar el archivo

./file

Puede haber algunos problemas con el PATH, por lo que puede para cambiar eso también ...

+0

Gracias, pero ese no es mi problema. Ya me he acostumbrado a comenzar mis scripts con #!/Usr/bin/perl. Puedo ejecutar scripts bien una vez que les haya otorgado permisos ejecutables; Solo estaba buscando una manera más simple de hacerlo. –

+11

¿Puedo recomendar '#!/Usr/bin/env perl' en su lugar? El programa 'env' básicamente encuentra el argumento dado (en este caso," perl ") en la RUTA y lo ejecuta. Es útil cuando envía scripts a otras personas, por ejemplo, uso una Mac y Perl está ubicado en/opt/local/bin. –

3

Lo que describes es la forma correcta de manejar esto.

Usted ha dicho que desea permanecer en la interfaz gráfica de usuario. Por lo general, puede establecer el bit de ejecución a través del menú de propiedades del archivo. También puede aprender cómo crear una acción personalizada para el menú contextual para que lo haga por usted si así lo desea. Esto depende de su entorno de escritorio, por supuesto.

Si utiliza un editor más avanzado, puede script de la acción a pasar cuando se guarda el archivo. Por ejemplo (estoy muy familiarizado con vim), puede agregar esto a su .vimrc para hacer cualquier archivo nuevo que comience con el ejecutable "#!/*/bin/*".

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

Al usar este consejo, me encontré con el problema mencionado aquí: https://bbs.archlinux.org/viewtopic.php?id=126304 Así que ahora estoy usando la versión ligeramente modificada 'autocmd BufWritePost * si getline (1) = ~ "^ #!/bin /" | ejecución silenciosa "! chmod a + x " | endif' – Gautam

0

Creo que el problema que se está ejecutando en es que, a pesar de que puede establecer sus propios valores de umask en el sistema, esto no le permiten controlar de manera explícita los permisos predeterminados establecidos en un nuevo archivo, gedit (o cualquier editor que use).

creo que este detalle no es modificable en gedit y la mayoría de otros editores. Sus opciones para cambiarlo son (a) piratear su propio mod de gedit o (b) encontrar un editor de texto que le permita establecer una preferencia por permisos predeterminados en archivos nuevos. (Lo siento, no conozco ninguno.)

A la luz de esto, en realidad no es tan malo tener a chmod sus archivos, ¿verdad?

5

No hay necesidad de cortar su editor, o cambiar editores.

su lugar, podemos llegar a una secuencia de comandos para ver sus directorios y archivos de desarrollo chmod a medida que se crean. Esto es lo que hice en el script bash adjunto. Probablemente quiera leer los comentarios y editar la sección 'config' que se ajuste a sus necesidades, entonces le sugiero colocarla en su directorio $ HOME/bin/y agregar su ejecución a su $ HOME/.login o archivo similar. O simplemente puede ejecutarlo desde la terminal.

Este script requiere inotifywait, que viene en el paquete de herramientas inotify en Ubuntu,

sudo apt-get install inotify-tools 

Sugerencias/ediciones/mejoras son bienvenidas.

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

¿No sería más sencillo configurar umask en el directorio? –

Cuestiones relacionadas