5 votes

Pourquoi certaines fonctions utilisateur ne sont pas reconnues par bash ?

Je peux définir une fonction comme :

myfunction () { ls -R "$1" ; }

Et puis

myfunction .

fonctionne.

Mais si je le fais

echo "myfunction ." | sh
echo "myfunction ." | bash

les messages sont :

sh: myfunction: not found  
bash: line 1: myfunction: command not found

Pourquoi ? Et comment puis-je appeler une fonction qui vient d'une chaîne de caractères si ce n'est en la passant dans sh ou bash ?

Je sais qu'il y a cette commande source mais je ne sais pas quand je dois utiliser l'option source et quand sh o bash . De plus, je ne peux pas passer par le canal source . Pour ajouter à la confusion, il y a cette commande . qui ne semble pas avoir de rapport avec le "." qui signifie "répertoire actuel".

9voto

Todd Gamblin Points 101

Au lieu d'utiliser eval vous pouvez export votre fonction pour qu'elle soit héritée par les sous-coques :

myfunction () { ls -R "$1" ; }
export -f myfunction

Et puis

echo "myfunction ." | bash

fonctionne.

echo "myfunction ." | sh ne le fera probablement pas, à moins que votre /bin/sh soit un lien symbolique vers bash.

8voto

Schof Points 952

Une définition de fonction n'a d'effet que dans l'instance actuelle de bash. Lorsque vous écrivez

echo "myfunction ." | bash

vous exécutez une autre instance de bash. Vous devrez définir la fonction dans cette autre instance.

Si vous avez une chaîne qui contient un nom de fonction et des arguments (cités, si nécessaire), ou plus généralement toute chaîne qui contient du code source Shell que vous voulez exécuter, utilisez la fonction eval builtin.

my_snippet='myfunction .'
eval "$my_snippet"

Si vous définissez des fonctions dans votre .bashrc ils ne sont disponibles que dans les shells interactifs, pas dans les scripts.

El . est (presque) équivalent à source et n'a rien à voir avec . qui signifie le répertoire courant.

1voto

Dag Points 1401

bash y sh s'attendent à ce que leur argument soit un fichier exécutable, et non une chaîne de caractères.

Vous pouvez exécuter le contenu d'une chaîne de caractères avec

eval "myfunction ."

Lorsque vous exécutez un programme par l'intermédiaire du Shell, celui-ci invoque normalement une nouvelle instance de la commande bash (o sh , csh , zsh etc. selon le cas), hériter de tous les paramètres de la Shell originale, et s'exécuter dans la nouvelle Shell. Cela vous permet de définir temporairement des variables ou de modifier des paramètres sans interférer avec votre environnement.

source ing une commande la fera s'exécuter dans votre Shell actuel, donc toutes les modifications qu'elle apporte à l'environnement persisteront lorsque la commande sortira. . est un synonyme de source .

Dans la plupart des cas, un script spécifiera dans quel script il est censé s'exécuter (avec le paramètre #!/bin/bash dans sa première ligne, par exemple), et il n'est pas nécessaire pour vous d'appeler bash explicitement.

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