Многострочный псевдоним в bash

13

У меня есть следующий скрипт. Это простой тестовый случай, где aлюбое строковое значение и bпредполагается, что это путь.

#!/bin/bash

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

Однако всякий раз, когда я пытаюсь выполнить ./sample.sh, я получаю следующие ошибки:

./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

и когда я пытаюсь, source sample.shя получаю следующее:

a: Undefined variable.

Моя цель состояла в том, чтобы сделать это псевдонимом, чтобы я мог получить этот сценарий и просто запустить псевдоним для выполнения строки команд. Может кто-то посмотреть на это и сообщить мне, в чем ошибка?

Йовин Миранда
источник
3
Когда вы думаете, что вам нужен многострочный псевдоним с несколькими командами, пришло время либо определить функцию, либо создать скрипт.
Сергей Колодяжный,
@SergiyKolodyazhnyy отметил, что
Йовин Миранда

Ответы:

15

У вас есть пара вопросов здесь

  1. в отличие от in csh, in bash(и других оболочек типа Bourne), псевдонимам присваивается =знак, напримерalias foo=bar

  2. цитаты не могут быть такими же вложенными; в этом случае вы можете использовать одинарные кавычки вокруг псевдонима и двойные кавычки внутри

  3. обратная косая черта \- это символ продолжения строки : синтаксически она превращает вашу команду в одну строку (противоположность того, что вы хотите)

Так

#!/bin/bash

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

Тестирование: сначала мы получаем исходный файл:

$ . ./myscript.sh

тогда

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

Если вы хотите использовать псевдоним внутри скрипта, помните, что псевдонимы включены по умолчанию только в интерактивных оболочках: чтобы включить их внутри скрипта, вам нужно будет добавить

shopt -s expand_aliases

Независимо от всего вышесказанного, вы должны рассмотреть возможность использования функции оболочки, а не псевдоним для таких вещей

steeldriver
источник
1
Еще одна причина , чтобы использовать одиночные кавычки вокруг псевдонима , что переменные внутри двойных кавычек расширены, так $aи $bбудет расширен во время определения, не тогда , когда псевдоним выполняется.
Бармар
Спасибо за решение, проблема здесь в том, что, несмотря на то, что я пишу сценарий, как вы, и когда я его выполняю, я получаю команду jo: not not found, псевдоним по какой-то причине не регистрируется. Когда я получаю исходный файл, я получаю эту ошибку «Непревзойденная». Единственная причина, по которой я выполняю псевдоним, а не функцию, заключается в том, что я хочу вызвать эту строку кода в командной строке, а в функции я не знаю, как этого добиться. Я видел вызов функции обычно находится внутри скрипта. Использование псевдонима было просто для того, чтобы я мог использовать его как функцию и вызывать его всякий раз, когда захочу
Jovin Miranda
В любом случае это исправлено, я использовал оболочку по умолчанию в качестве tcsh, следовательно, проблема приближалась.
Йовин Миранда,
8

Привыкайте использовать функции в оболочке типа POSIX. У вас нет проблем с цитированием:

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
получил то, что я на самом деле сделал, это использовать следующие. команда "$ @", чтобы я мог вызвать имя функции во время выполнения файла
Jovin Miranda