Code and write bash scripts

This article is just a draft for the moment. Thought you can find some interesting tips…

 

• Always begin your script with the instruction that telles the shell what program to interpret the script with, when executed. It is called the Shebang. I personally always use:
#!/bin/bash
In this example, the script is to be interpreted and run by the bash shell.

Some other example shebangs are:
#!/bin/sh — Execute the file using sh, the Bourne shell, or a compatible shell
#!/bin/csh — Execute the file using csh, the C shell, or a compatible shell
#!/usr/bin/perl -T — Execute using Perl with the option for taint checks
#!/usr/bin/php — Execute the file using the PHP command line interpreter
#!/usr/bin/python -O — Execute using Python with optimizations to code
#!/usr/bin/ruby — Execute using Ruby
#!/bin/ksh #!/bin/awk #!/bin/expect

 

• Shell loop using non-integer variable:
RangeNumber=$(awk 'BEGIN{for(j=0;j<=18;j+=2)print j/100}') #####
for Number in $RangeNumber 0.07 #### you can add another number such as 0.07 here
do
printf -v Number "%1.2f" $Number # in order to impose the format with 2 digits like in 0.10 (N.B. adding \n would go to next line)
echo $Number
done
end
exit 0

 

• Mathematics and operation in the shell:
Example you have:
Angle=0.195
then
iPreviousAngle=`echo "($Angle*1000+5)/1000" | bc -l`
printf -v iPreviousAngle "%1.3f" $iPreviousAngle # in order to impose the format with 2 digits like in 0.10 (N.B. adding \n would go to next line)
echo "Angle=$Angle"
echo "PreviousAngle=$iPreviousAngle"

and therefore
echo $iPreviousAngle
gives
PreviousAngle=.20000000000000000000


• To properly format the variable:
printf -v iPreviousAngle "%1.3f" $iPreviousAngle # in order to impose the format with 2 digits like in 0.10 (N.B. adding \n would go to next line)
echo "PreviousAngle=$iPreviousAngle"

PreviousAngle=0.200

How to remotely use Matlab on a distant computer (running Os X)

To remotely use Matlab on the computer, first check if Matlab is installed and then check the path of your folder within matlab (for starters, the easiest way is to actually go on the computer).

Then connect to the computer by ssh and then type :
matlab -nosplash -nodesktop -nodisplay -logfile output.txt -r 'myfunction(myarguments)'

if this is a function… or

matlab -nodesktop -nodisplay < myscript.m > output.txt 2>&1 &

if you want to run a script…

As usual please comment if you have any remarks or question 😉

Un .bashrc pratique, avec historique et autocompletion

• Pour ajouter l’autocompletion :
# Case insensitive
bind "set completion-ignore-case on"

• Pour ajouter l’historique :
# History search
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

Ensuite, pour que ces changement prennent effet, depuis le home (que l’on peut retrouver en tapant cd dans le terminal), taper :
source .bashrc

Petites notes de commandes shell

• empty trash on Mac OS X using Terminal:
rm -rf ~/.Trash/*
Sometimes you need to force it so use a sudo command:
sudo rm -rf ~/.Trash/* (your password will be required).
____________________________________________________________________________
• Voir combien il reste d’espace disque :
df -h (-h pour avoir les données en octets)
____________________________________________________________________________
• Faire une recherche d’un mot dans Vim :
/puis_le_mot puis shift+n (« n » pour « next »)
____________________________________________________________________________
• Rechercher une chaine de caractère dans la sortie d’une autre instruction :
your_shell_command | grep the_string_you_are_looking_for
e.g.:
ps | grep IPA Here I am looking within the process currently running (using the command Process Status ps the process called IPA).
____________________________________________________________________________
• install top sur Mac Os X : avec Homebrew
brew install htop
____________________________________________________________________________
• pour compiler en C mon code contenu dans main.c (et en faire un executable que l’on appelle par exemple CCC : se mettre dans le dossier contenant le main.c puis :
gcc -o CCC main.c (sur Linux, il faut linker la bibliothèque Math donc ajouter -lm à la fin de la ligne de commande)

• ensuite, lancer le calcul depuis l’executable :
./CCC
(NB: on peut lancer le calcul avec un nohup ou encore en utilisant screen 😉
____________________________________________________________________________
• lancer une command line qui survit à la mort du shell qui l’a lancé :
nohup [ma ligne de commande, le programme que je veux lancer]

• si en plus on souhaite écrire la sortie de ce programme et l’écrire dans un fichier :
nohup ./mon_programme > sortie.txt

• si en revanche on veut écrire dans un fichier sortie sans afficher la sortie à l’écran et continuer d’utiliser le Terminal, alors :
nohup ./mon_programme > sortie.txt &

• si installé, on peut aussi utiliser screen puis on lance sa commande dedans. Ensuite pour détacher la fenêtre du terminal (de la commande qui tourne toujours) :
crtl+a crtl+d (ou crtl+a d)
puis pour re-attacher le terminal virtuel de screen depuis un autre terminal :
screen -rd

____________________________________________________________________________
• lorsque l’on écrit un script shell (.sh), il faut le rendre executable pour pouvoir le lancer. On utilise alors la commande chmod avec l’option +x:
chmod +x script.sh
Je reviendrai sur l’écriture de scripts shell plus tard.
____________________________________________________________________________
• Installation de SSHFS sur Mac OS:
1. Télécharger FUSE et l’installer : http://sourceforge.net/projects/osxfuse/files/
2. Télécharger SSHFS et l’installer : https://github.com/osxfuse/sshfs/releases
Plus d’explications (installation, désinstallation sur https://github.com/osxfuse/osxfuse/wiki/SSHFS)

• Utilisation de SSHFS
1. créer le lien entre les deux ordi. Là on crée l’image disque virtuelle qui lie mon home sur ingres et on le met dans testcluster/
mkdir testcluster
sshfs login@cluster: testcluster/
2. ensuite, on peut aller dans l’arborescence de Ingres (ordinateur distant) depuis mon mac (sur lequel je suis) en allant dans le dossier testcluster/
3. Parfois, on n’arrive pas à faire le sshfs car le dossier testcluster n’a pas été démonté. Il faut alors forcer le démontage du disque virtuel par la commande :
sudo diskutil umount force [path] (pour moi [path] = ~/testluster)
puis remonter à nouveau l’image virtuelle.
4. de manière générale je préconise de démonter le disque virtuel à chaque fois que l’on se déconnecte du réseau (et/ou que l’on éteint le mac).
____________________________________________________________________________
• Pour copier le même fichier dans plusieurs répertoires :
echo ./nomgenerique_*/ | xargs -n 1 cp datain.txt
Sinon, on peut aussi faire ça :
echo dir1 dir2 dir3 | xargs -n 1 cp file1
Will copy file1 to dir1, dir2, and dir3. xargs will call cp 3 times to do this, see the man page for xargs for details.

De même, pour effacer plusieurs fichier (par exemple output*.txt) dans plusieurs répertoires :
echo ./nomgenerique_*/output* | xargs -n 1 rm
____________________________________________________________________________