#1 Le 14/06/2018, à 12:27
- Compte supprimé
alias lance fonction à 3 param. Comment gérer *
Bonjour,
J'ai créé un fichier anameContains.sh composé de :
#!/bin/bash
function anameContains {
local directory="$1"
local name="$2"
local search="$3"
if [ -d ${directory} ] && [ -n ${name} ] && [ -n ${search} ]
then
find ${directory} -iname "${name}" | grep -0 "${search}"
else
echo "anameContains(dir,file,string)"
fi
}
anameContains $1 $2 $3
(PS : chmod ugo+x anameContains.sh, bien sûr)
Ce que je veux faire, c'est avoir un alias pour faire :
alias anameContains="~/anameContains.sh"
Pour pouvoir l'utiliser ainsi dans un terminal :
anameContains . * blabla
Qui me chercherait à partir d'un répertoire (ici local) un titre de fichier (ici, tous, mais on pourrait mettre *cpp, ou autre...) qui contient en particulier un morceau de texte (ici blabla).
Cependant, je n'arrive même pas à faire fonctionner le ./anameContains.sh (sans même parler de l'alias encore pour le moment), quand je lance
./anameContains.sh . * blabla
ca plante, car * se lance comme si c'était la commade ls * dans le répertoire local, et envoit donc le contenu du répertoire local au lieu du symbole * dans $2...
Ou bien, y a-t-il une meilleure solution à ce problème?
Merci
Cdlt
#2 Le 14/06/2018, à 13:45
- serged
Re : alias lance fonction à 3 param. Comment gérer *
Pourquoi faire simple quand on peut faire compliqué ?
Tu ne peux pas renommer (ou faire un lien symbolique vers...) ton anameContains.sh en anameContains et le placer dans un répertoire contenu dans le $PATH (par exemple ~/bin) ?
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#3 Le 14/06/2018, à 14:14
- Watael
Re : alias lance fonction à 3 param. Comment gérer *
UMQ! *
$ maFonc(){ echo "$1";}
$ maFonc '*'
*
les variables doivent toutes et TOUJOURS être entre guillemets
les caractères spéciaux doivent être protégés par des apostrophes, ou un antislash.
--
*Use More Quotes!
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 15/06/2018, à 16:17
- Compte supprimé
Re : alias lance fonction à 3 param. Comment gérer *
Solution :
(but de la fonction un peu différent de celui présenté ci-dessus, car je voulais faire fonctionner la version simple avant de faire celle-ci)
Dans ~/bin (export PATH:$PATH:~/bin, si nécessaire), créer un fichier afileContains (chmod ugo+x afileContains)
#!/bin/bash
#pass metacharacter * as "*" or \*
#bash -x ./afileContains . "*" dir
#bash -x ./afileContains . \* dir
#bash -x ./afileContains "." "*" "dir"
#never: ./afileContains "." \* \*
directory="$1"
name="$2"
search="$3"
function afileContains {
find ${directory} -type f -iname "*${name}*" -print0 | xargs -0 grep -inT --color "${search}"
}
afileContains ${directory} ${name} ${search}
Appel de la fonction
> plus besoin d'alias, car dans ~/bin, comme précisé dans une réponse précédemment
> 4 derniers appels sont identiques
afileContains . .cpp include
afileContains . \* include
afileContains . "*" include
afileContains . ? include
afileContains . "?" include
Donne tous les fichiers (-f), ignore-case (-i), *.cpp (des * sont également placés directement dans la commande find pour simplifier le cas par défaut maintenant, mais on peut aussi le passer en argument) qui contiennent include, ignore-case (-i), précise le numéro de ligne (-n), aligne le début de ligne pour les résultats provenant d'un même fichier (-T), met en couleur (--color). Gère les espaces, retour à la ligne et autre avec -print0 et -0.
Cdlt
Dernière modification par Compte supprimé (Le 15/06/2018, à 16:21)