Creating executable files in Linux
Make file executable:
chmod +x file
Find location of perl:
which perl
This should return something like
/bin/perl sometimes /usr/local/bin
Then in the first line of your script add:
#!"path"/perl with path from above e.g.
#!/bin/perl
Then you can execute the file
./file
There may be some issues with the PATH, so you may want to change that as well ...
No need to hack your editor, or switch editors.
Instead we can come up with a script to watch your development directories and chmod files as they're created. This is what I've done in the attached bash script. You probably want to read through the comments and edit the 'config' section as fits your needs, then I would suggest putting it in your $HOME/bin/ directory and adding its execution to your $HOME/.login or similar file. Or you can just run it from the terminal.
This script does require inotifywait, which comes in the inotify-tools package on Ubuntu,
sudo apt-get install inotify-tools
Suggestions/edits/improvements are welcome.
#!/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 watchSUBDIRS="TRUE" # watch subdirectories tooNOTIFY_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 myselfSCRIPT="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=""fiwhile 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_FILEdone
What you describe is the correct way to handle this.
You said that you want to stay in the GUI. You can usually set the execute bit through the file properties menu. You could also learn how to create a custom action for the context menu to do this for you if you're so inclined. This depends on your desktop environment of course.
If you use a more advanced editor, you can script the action to happen when the file is saved. For example (I'm only really familiar with vim), you could add this to your .vimrc to make any new file that starts with "#!/*/bin/*
" executable.
au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent !chmod +x <afile> | endif | endif