Bash: usa un alias en una variable

9

Estoy escribiendo un script bash que ejecuta cada uno de sus argumentos como un comando. Esto funciona para comandos en mi PATH, pero no para alias. Puedo llamar directamente a un alias en el script, pero no puedo llamar a un alias que se haya pasado como argumento.

El problema (supongo) es que los alias se expanden antes que las variables. ¿Hay alguna forma de ejecutar alias desde una variable?

Script de muestra:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

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

runall "echo test"funciona, pero runall "myalias"darunall: line 8: myalias: command not found

Jayson
fuente

Respuestas:

9

Después de algunas pruebas, he concluido lo siguiente:

  • Los alias solo funcionan en modo interactivo (agregar -ial shebang).
  • Los alias no se evalúan cuando provienen de una fuente interpretada (en este caso, la variable.
  • Puede obtener bash para usar el alias eval $1. Tenga en cuenta que evalcualquier cosa creada con una variable es peligrosa, pero dado que todo el punto del script requiere una ejecución arbitraria, no haré un gran problema con eso.

Desde la página de manual de bash:

Los alias no se expanden cuando el shell no es interactivo, a menos que la opción del shell expand_aliases se configure usando shopt (consulte la descripción de shopt en SHELL BUILTIN COMMANDS a continuación).

Para que pueda agregar en shopt -s expand_aliaseslugar de -i.

También,

Los alias se expanden cuando se lee un comando, no cuando se ejecuta.

Como las variables no se expanden antes de leer el comando, no se expandirán más usando el alias.

Kevin
fuente
1
Bueno saber. Solo por curiosidad: ¿por qué es peligroso para las evalvariables?
1
@hesse Considera eval "echo $1". Di que llamo ./script.sh "hello;rm -rf ~. ¿Qué se ejecuta? echo hello, seguido por rm -rf ~. Obviamente ese es un ejemplo artificial, pero el principio es válido.
Kevin
agregando evalfrente a $1trabajado, ya que ya lo había hecho shopt -s expand_aliases. ¡Gracias!
Jayson
1

Tuve un problema similar y logré resolver mi problema convirtiendo mis alias en funciones, como se describe en este sitio , que funcionó para mí.

p.ej

alias lsd="ls -lash"

a

function lsd() { ls -lash; }
aydow
fuente