Alias ​​à plusieurs lignes dans bash

13

J'ai le script suivant. C'est un cas de test simple où aest n'importe quelle valeur de chaîne et best censé être un chemin.

#!/bin/bash

alias jo "\
echo "please enter values "\
read a \
read -e b \
echo "My values are $a and $b""

Cependant, chaque fois que j'essaie d'exécuter ./sample.sh, j'obtiens les erreurs suivantes:

./sample.sh: line 3: alias: jo: not found
./sample.sh: line 3: alias: echo please: not found
./sample.sh: line 3: alias: enter: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: read a read -e b echo My: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: are: not found
./sample.sh: line 3: alias: and: not found
./sample.sh: line 3: alias: : not found

et quand j'essaye source sample.shj'obtiens ce qui suit:

a: Undefined variable.

Mon objectif était d'en faire un alias afin que je puisse trouver ce script et simplement exécuter l'alias pour exécuter la ligne de commandes. Quelqu'un peut-il regarder cela et me faire savoir quelle est l'erreur?

Jovin Miranda
la source
3
Lorsque vous pensez avoir besoin d'un alias multiligne et à commandes multiples, il est temps de définir une fonction ou de créer un script.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy a noté que
Jovin Miranda

Réponses:

15

Vous avez quelques problèmes ici

  1. contrairement à in csh, in bash(et à d'autres coquilles de type Bourne), les alias sont attribués avec un =signe, par exemplealias foo=bar

  2. les guillemets ne peuvent pas être imbriqués comme ça; dans ce cas, vous pouvez utiliser des guillemets simples autour de l'alias et des guillemets doubles à l'intérieur

  3. la barre oblique inverse \est un caractère de continuation de ligne : syntaxiquement, elle transforme votre commande en une seule ligne (l'opposé de ce que vous voulez)

Donc

#!/bin/bash

alias jo='
echo "please enter values "
read a 
read -e b 
echo "My values are $a and $b"'

Test: d'abord nous source le fichier:

$ . ./myscript.sh

ensuite

$ jo
please enter values 
foo bar
baz
My values are foo bar and baz

Si vous souhaitez utiliser l'alias dans un script, n'oubliez pas que les alias ne sont activés que par défaut dans les shells interactifs: pour les activer dans un script, vous devrez ajouter

shopt -s expand_aliases

Indépendamment de tout ce qui précède, vous devriez envisager d'utiliser une fonction shell plutôt qu'un alias pour des choses comme celle-ci

tournevis
la source
1
Une autre raison d'utiliser des guillemets simples autour de l'alias est que les variables à l'intérieur des guillemets doubles sont développées, donc $aet $bseraient développées au moment de la définition, pas lorsque l'alias est exécuté.
Barmar
Merci pour la solution, le problème ici est malgré que j'écrive le script tel que vous l'avez donné et quand je l'exécute, je reçois jo: la commande n'a pas trouvé l'alias pour une raison quelconque ne s'enregistre pas. lorsque je source le fichier, j'obtiens cette erreur inégalée ". La seule raison pour laquelle je fais un alias et non une fonction est parce que je veux appeler cette ligne de code sur la ligne de commande et dans la fonction, je ne sais pas comment y parvenir. J'ai vu l'appel de fonction est généralement dans le script. L'utilisation de l'alias était juste pour m'assurer que je peux l'utiliser comme une fonction et l'appeler quand je le veux
Jovin Miranda
Quoi qu'il en soit, j'utilisais le shell par défaut comme tcsh, d'où le problème.
Jovin Miranda
8

Habituez-vous à utiliser des fonctions dans le shell de type POSIX. Vous n'avez aucun des problèmes de citation:

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}
glenn jackman
la source
Merci pour la solution, cela a fonctionné lorsque j'appelle la fonction dans le script. Comment puis-je appeler la fonction à partir de la ligne de commande elle-même, car j'ai plusieurs scripts de ce type et préférerais une situation où j'écrirais toutes les fonctions dans un fichier mais les appellerais plutôt à partir de la ligne de commande. C'est la raison pour laquelle j'ai opté pour l'alias
Jovin Miranda
C'est exactement pareil. Mettez les fonctions dans un fichier et
sourcez
je l'ai obtenu ce que j'ai réellement fait est d'utiliser le foll. commande "$ @" pour que je puisse appeler le nom de la fonction lors de l'exécution du fichier
Jovin Miranda