Псевдонім з декількома рядками в баші


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. В відміну csh, в 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

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


1
Ще одна причина , щоб використовувати одиничні лапки навколо псевдоніма , що змінні всередині подвійних лапок розширені, так $aі $bбуде розширено під час визначення, не тоді , коли псевдонім виконується.
Бармар

Дякую за рішення, проблема тут, незважаючи на те, що я написав сценарій, як дано вами, і коли я його виконую, я отримую jo: команда не знайшла псевдонім, чомусь не реєструюсь. коли я джерело файлу, то я отримую цю помилку Незрівняна ". Єдина причина, що я роблю псевдонім, а не функція, це причина, я хочу викликати цей рядок коду в командному рядку і в функції, я не знаю, як цього досягти. Я бачив Виклик функції зазвичай знаходиться в рамках сценарію. Використання псевдоніму було лише для того, щоб я міг використовувати його як функцію та називати її коли завгодно
Джовін Міранда

у будь-якому випадку виправили це, я використовував оболонку за замовчуванням, як 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.