Contenu | Rechercher | Menus

Annonce

L'équipe des administrateurs et modérateurs du forum vous invite à prendre connaissance des nouvelles règles.
En cas de besoin, vous pouvez intervenir dans cette discussion.

Ubuntu 18.04 LTS
Ubuntu-fr propose des clés USB de Ubuntu et toutes ses « saveurs » ainsi qu'un magnifique t-shirt pour cette toute nouvelle version d'Ubuntu !

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/06/2018, à 13:27

enok

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

Hors ligne

#2 Le 14/06/2018, à 14: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) ?


Linux-Mint 18.3 Sylvia 64 (Cinnamon) sur ASUS F2A55/AMD A8-5600K APU

Hors ligne

#3 Le 14/06/2018, à 15: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!


eval, c'est mal.

Hors ligne

#4 Le 15/06/2018, à 17:17

enok

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 enok (Le 15/06/2018, à 17:21)

Hors ligne