linux - kali - ejemplos de programas en bash
Creando archivos ejecutables en Linux (5)
Una cosa que planeo hacer es escribir (dolorosamente simples) scripts Perl, y me gustaría poder 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 dos cosas:
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 umask está configurada en 022, lo que debería estar bien, por lo que yo entiendo, pero parece que los archivos se crean como archivos de texto (con 666 permisos predeterminados) en lugar de archivos ejecutables (con 777 permisos predeterminados).
Tal vez solo soy perezoso, pero creo que debe haber una manera más conveniente que cambiar cada uno de los guiones que uno crea.
Creo que el problema al que te estás enfrentando es que, aunque puedes establecer tus propios valores de umask en el sistema, esto no te permite controlar explícitamente los permisos predeterminados establecidos en un nuevo archivo por gedit (o el editor que uses) .
Creo que este detalle está codificado en gedit y en la mayoría de los 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, realmente no es tan malo tener que modificar sus archivos, ¿verdad?
Hacer el archivo ejecutable:
archivo chmod + x
Encuentra la ubicación de perl:
que perl
Esto debería devolver algo así como
/ bin / perl a veces / usr / local / bin
Luego, en la primera línea de su script, agregue:
#! "ruta" / perl con ruta desde arriba, por ejemplo
#! / bin / perl
Entonces puedes ejecutar el archivo
./archivo
Puede haber algunos problemas con la RUTA, por lo que es posible que desee cambiar eso también ...
Lo que describes es la forma correcta de manejar esto.
Dijiste que quieres permanecer en la GUI. 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 usa un editor más avanzado, puede programar la acción para que ocurra cuando se guarde el archivo. Por ejemplo (estoy muy familiarizado con vim), puede agregar esto a su .vimrc para crear cualquier archivo nuevo que comience con el ejecutable " #!/*/bin/*
".
au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent !chmod +x <afile> | endif | endif
No es necesario hackear su editor o cambiar de editor.
En su lugar, podemos crear un script para ver sus directorios de desarrollo y archivos 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 inotify-tools 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
Realmente no es tan importante. Podrías hacer una secuencia de comandos con el único comando:
chmod a+x *.pl
Y ejecute el script luego de crear un archivo perl. Alternativamente, podría abrir un archivo con un comando como este:
touch filename.pl && chmod a+x filename.pl && vi filename.pl # choose your favorite editor