Bash: Використовуйте псевдонім у змінній


9

Я пишу bash-скрипт, який виконує кожен свій аргумент як команду. Це працює для команд у моєму PATH, але не для псевдонімів. Я можу безпосередньо викликати псевдонім у сценарії, але я не можу назвати псевдонім, переданий як аргумент.

Проблема (я припускаю) полягає в тому, що псевдоніми розгортаються перед змінними. Чи є спосіб запустити псевдоніми зі змінної?

Приклад сценарію:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

while (( "$#" )); do
    $1
    shift
done

runall "echo test"працює, але runall "myalias"даєrunall: line 8: myalias: command not found

Відповіді:


9

Після деяких тестувань я зробив висновок про наступне:

  • Псевдоніми працюють лише в інтерактивному режимі (додайте -iдо шебангу).
  • Псевдоніми не оцінюються, коли вони походять з інтерпретованого джерела (у цьому випадку змінної.
  • Ви можете отримати баш для використання псевдоніма з eval $1. Зауважте, що що- evalнебудь створене зі змінною небезпечно, але оскільки вся суть сценарію вимагає довільного виконання, я не зроблю з цього занадто великої угоди.

З сторінки "bash man":

Псевдоніми не розгортаються, коли оболонка не є інтерактивною, якщо не встановлено параметр оболонки expand_aliases, використовуючи shopt (див. Опис простріленого під SHELL BUILTIN COMMANDS нижче).

Тож ви можете додати shopt -s expand_aliasesзамість -i.

Також,

Псевдоніми розгортаються, коли команда читається, а не коли вона виконується.

Оскільки змінні не розгортаються до зчитування команди, вони не будуть розширені далі за допомогою псевдоніму.


1
Добре знати. Лише з цікавості: чому це небезпечно для evalзмінних?

1
@hesse Поміркуйте eval "echo $1". Скажіть, я дзвоню ./script.sh "hello;rm -rf ~. Що виконується? echo hello, За яким слід rm -rf ~. Очевидно, що це надуманий приклад, але принцип дотримується.
Кевін

додавання evalперед $1відпрацьованим, оскільки я вже мав shopt -s expand_aliases. Дякую!
Джейсон

1

У мене була подібна проблема і мені вдалося вирішити свою проблему, перетворивши псевдоніми на функції, як описано на цьому веб-сайті , який працював на мене.

напр

alias lsd="ls -lash"

до

function lsd() { ls -lash; }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.