1 votes

Fonction qui interprète les derniers 'n' caractères d'un mot comme argument

Existe-t-il un moyen de passer les n caractères finaux d'une commande à une fonction, de sorte qu'elle l'exécute comme deux commandes ? Par exemple, je définis ma fonction comme abcx et chaque fois que j'entre

abcxfoo

dans la ligne de commande, ma fonction l'interprète comme abcx foo. Je sais comment passer des arguments tels que $1 et $@ mais dans certains cas, une fonction définie une fois comme celle-ci pourrait vraiment vous faire gagner du temps.

Ce à quoi je fais référence, c'est que j'ai beaucoup d'alias cd que j'aimerais appeler comme cdlinux, me permettant de basculer sur ~/Documents/Linux, sans avoir besoin de définir un alias pour chaque dossier individuel à l'intérieur de mon Documents (ce que j'ai fait jusqu'à présent jusqu'à la date).

2voto

rici Points 3733

Vous ne pouvez pas faire exactement cela, mais avec un peu de travail et bash 4, vous pouvez implémenter la fonctionnalité.

Lorsque bash 4 rencontre une commande non définie, il recherche une fonction shell appelée command_not_found_handle et s'il la trouve, il l'appelle, en passant le nom de la commande non trouvée en tant que $1 et les arguments restants en tant que $2...

Vous pouvez donc, par exemple, gérer vos commandes cd et ffdir en ajoutant quelque chose comme ceci à votre fichier .bashrc. (note: je ne traite pas la sensibilité à la casse ici, donc il reste encore du travail à faire.)

command_not_found_handle() {
  case $1 in
    cd*) if [[ -d "$HOME/Documents/${1#cd}" ]]; then
           cd "$HOME/Documents/${1#cd}"
           return 0
         fi
         # En cas d'échec, passe au message d'erreur
         ;;
    ffdir*) find . -type d -iname "${1#ffdir}"
            return 0
            ;;
    # Etc...
  esac

  # Si rien d'autre ne fonctionne, faites simplement ce que bash aurait fait
  printf "%s: commande introuvable\n" "$1" >&2
  return 127
}

0voto

Mohsin Points 11

Non. Ce que vous demandez est impossible, comment le shell pourrait-il deviner où se termine le nom de la fonction ? Il a besoin d'un espace pour savoir qu'il doit essayer d'interpréter ce que vous avez écrit comme une commande.

Cependant, ce que vous cherchez est probablement la variable d'environnement CDPATH :

CDPATH

Une liste de répertoires séparés par des deux-points utilisée comme chemin de recherche pour la commande intégrée 'cd'.

Cela est utilisé par cd comme suit :

cd

  cd [-L|[-P [-e]]] [répertoire]

Changer le répertoire de travail courant en 'répertoire'. Si aucun répertoire n'est spécifié, la valeur de la variable d'environnement HOME est utilisée. Si la variable d'environnement CDPATH existe, elle est utilisée comme chemin de recherche. Si le répertoire commence par un slash, CDPATH n'est pas utilisé.

En d'autres termes, si vous définissez CDPATH dans votre ~/.bashrc comme ceci :

export CDPATH=".:~/Documents"

Vous pourrez alors utiliser la commande cd et la complétion par tabulation pour lister tous les sous-répertoires de ~/Documents comme si vous étiez déjà dans ~/Documents.


Une autre approche serait d'utiliser une fonction. Ajoutez simplement ceci à votre ~/.bashrc :

cddoc(){
    cd "$HOME/Documents/$1"
}

Cependant, cela a pour inconvénient que la complétion par tabulation ne fonctionnera pas. Vous pouvez contourner cela, mais cela ne vaut pas la peine étant donné que CDPATH est probablement exactement ce que vous recherchez.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X