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

Jayson
источник

Ответы:

9

После некоторых испытаний я пришел к следующему выводу:

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

Со страницы руководства bash:

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

Таким образом, вы могли бы добавить shopt -s expand_aliasesвместо -i.

Также,

Псевдонимы раскрываются при чтении команды, а не при ее выполнении.

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

Kevin
источник
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; }
aydow
источник