Voici trois exemples de fonctions que j'ai dans mes ~/.bashrc
qui sont essentiellement les alias qui acceptent un paramètre :
#Utility required by all below functions.
#https://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-bash-variable#comment21953456_3232433
alias trim="sed -e 's/^[[:space:]]*//g' -e 's/[[:space:]]*\$//g'"
.
:<<COMMENT
Alias function for recursive deletion, with are-you-sure prompt.
Example:
srf /home/myusername/django_files/rest_tutorial/rest_venv/
Parameter is required, and must be at least one non-whitespace character.
Short description: Stored in SRF_DESC
With the following setting, this is *not* added to the history:
export HISTIGNORE="*rm -r*:srf *"
- https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash
See:
- y/n prompt: https://stackoverflow.com/a/3232082/2736496
- Alias w/param: https://stackoverflow.com/a/7131683/2736496
COMMENT
#SRF_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
SRF_DESC="srf [path]: Recursive deletion, with y/n prompt\n"
srf() {
#Exit if no parameter is provided (if it's the empty string)
param=$(echo "$1" | trim)
echo "$param"
if [ -z "$param" ] #http://tldp.org/LDP/abs/html/comparison-ops.html
then
echo "Required parameter missing. Cancelled"; return
fi
#Actual line-breaks required in order to expand the variable.
#- https://stackoverflow.com/a/4296147/2736496
read -r -p "About to
sudo rm -rf \"$param\"
Are you sure? [y/N] " response
response=${response,,} # tolower
if [[ $response =~ ^(yes|y)$ ]]
then
sudo rm -rf "$param"
else
echo "Cancelled."
fi
}
.
:<<COMMENT
Delete item from history based on its line number. No prompt.
Short description: Stored in HX_DESC
Examples
hx 112
hx 3
See:
- https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#HX_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
HX_DESC="hx [linenum]: Delete history item at line number\n"
hx() {
history -d "$1"
}
.
:<<COMMENT
Deletes all lines from the history that match a search string, with a
prompt. The history file is then reloaded into memory.
Short description: Stored in HXF_DESC
Examples
hxf "rm -rf"
hxf ^source
Parameter is required, and must be at least one non-whitespace character.
With the following setting, this is *not* added to the history:
export HISTIGNORE="*hxf *"
- https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash
See:
- https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#HXF_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
HXF_DESC="hxf [searchterm]: Delete all history items matching search term, with y/n prompt\n"
hxf() {
#Exit if no parameter is provided (if it's the empty string)
param=$(echo "$1" | trim)
echo "$param"
if [ -z "$param" ] #http://tldp.org/LDP/abs/html/comparison-ops.html
then
echo "Required parameter missing. Cancelled"; return
fi
read -r -p "About to delete all items from history that match \"$param\". Are you sure? [y/N] " response
response=${response,,} # tolower
if [[ $response =~ ^(yes|y)$ ]]
then
#Delete all matched items from the file, and duplicate it to a temp
#location.
grep -v "$param" "$HISTFILE" > /tmp/history
#Clear all items in the current sessions history (in memory). This
#empties out $HISTFILE.
history -c
#Overwrite the actual history file with the temp one.
mv /tmp/history "$HISTFILE"
#Now reload it.
history -r "$HISTFILE" #Alternative: exec bash
else
echo "Cancelled."
fi
}
Références :
3 votes
Duplicata possible de Shell script : Comment passer des arguments de ligne de commande à un alias UNIX ?
3 votes
Assurez-vous que vous utilisez des guillemets autour des args
"$1"
1 votes
Cette question est hors sujet pour l'OS. Elle a été répondu sur UNIX.SE et la réponse est que vous n'avez même pas besoin de vous en soucier : "Par exemple, si vous deviez aliaser
ls
als -la
puis en tapantls foo bar
serait vraiment exécuterls -la foo bar
sur la ligne de commande".11 votes
Cela n'aiderait pas à interpoler une variable au milieu d'une chaîne de caractères
4 votes
Voici le petit alias de test que j'ai utilisé pour découvrir cette erreur...
alias test_args="echo PREFIX --$1-- SUFFIX"
qui, lorsqu'il est appelé avectest_args ABCD
donne la sortie de console suivantePREFIX ---- SUFFIX ABCD
5 votes
Notez que depuis au moins 1996, la documentation de bash contient la ligne : " Pour presque tous les usages, les alias sont remplacés par les fonctions du shell ", et je pense que c'est un euphémisme. Il n'y a absolument aucune raison d'utiliser un alias au lieu d'une fonction.
2 votes
@WilliamPursell : "Absolument aucune raison" ? Tout d'abord, il y a certains cas où une fonction ne peut pas remplir le rôle d'un alias, par exemple un alias se terminant par une citation ouverte ne pourrait pas être fait comme une fonction (bien que vous ne voudriez probablement pas le faire de toute façon). De manière plus réaliste, un alias se terminant par
do
serait impossible ou peu pratique à écrire comme une fonction. Deuxièmement, pour tous vous pouvez facilement développer l'alias à l'aide de la commandeA-a
dans ZSH ouC-A-e
dans Bash (ou ce que vous configurez), alors que cette fonctionnalité n'est pas disponible pour les fonctions.0 votes
@pyrocrasty En bash, vous pouvez utiliser l'expansion de tabulation pour développer les noms de fonctions. (Je ne suis pas sûr pour zsh).
0 votes
@WilliamPursell : Je ne parle pas de la complétion de nom, je veux dire que vous pouvez développer le nom de l'alias dans sa définition en ligne. (Essayez de taper un alias et ensuite
C-A-e
avec le curseur juste après) C'est particulièrement pratique lorsque vous ne vous souvenez pas des options d'une commande mais que vous avez un alias proche de ce dont vous avez besoin.0 votes
@pyrocrasty C'est une fonctionnalité très pratique (si j'utilisais des alias !). Pour les futurs lecteurs, C-A-e est la liaison de lecture par défaut pour la fonction alias-expand-line, qui n'est pas liée par défaut en mode vi.