web-dev-qa-db-fra.com

Alias ​​multi-ligne dans bash

J'ai le script suivant. Il s’agit d’un cas de test simple où a est une valeur de chaîne et b est supposé ê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'essaie source sample.sh j'obtiens ce qui suit:

a: Undefined variable.

Mon but était de faire de ce pseudo un alias afin que je puisse obtenir ce script et le lancer pour exécuter la ligne de commandes. Quelqu'un peut-il regarder cela et me laisser savoir quelle est l'erreur?

9
Jovin Miranda

Vous avez quelques problèmes ici

  1. contrairement à csh, à bash (et à d'autres shells de type Bourne), les alias sont affectés d'un signe =, par exemple. alias foo=bar

  2. les citations ne peuvent pas être imbriquées 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 continuation de ligne : syntaxiquement, votre commande est transformée en un simple ligne (le contraire de ce que vous voulez)

Alors

#!/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

puis

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

Si vous souhaitez utiliser l'alias dans un script, rappelez-vous que les alias ne sont activés que par défaut dans les shells interactifs: pour les activer dans un script, vous devez besoin d'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

12
steeldriver

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"
}
6
glenn jackman