Bash: Verwenden Sie einen Alias ​​in einer Variablen

9

Ich schreibe ein Bash-Skript, das jedes seiner Argumente als Befehl ausführt. Dies funktioniert für Befehle in my PATH, jedoch nicht für Aliase. Ich kann einen Alias ​​im Skript direkt aufrufen, aber ich kann keinen Alias ​​aufrufen, der als Argument übergeben wurde.

Das Problem (ich nehme an) ist, dass Aliase vor Variablen erweitert werden. Gibt es eine Möglichkeit, Aliase aus einer Variablen auszuführen?

Beispielskript:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

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

runall "echo test"funktioniert, runall "myalias"gibt aberrunall: line 8: myalias: command not found

Jayson
quelle

Antworten:

9

Nach einigen Tests habe ich Folgendes festgestellt:

  • Aliase funktionieren nur im interaktiven Modus ( -izum Shebang hinzufügen ).
  • Aliase werden nicht ausgewertet, wenn sie aus einer interpretierten Quelle stammen (in diesem Fall der Variablen.
  • Sie können bash bekommen, um den Alias ​​mit zu verwenden eval $1. Beachten Sie, dass evalalles , was mit einer Variablen erstellt wurde, gefährlich ist, aber da der gesamte Punkt des Skripts eine willkürliche Ausführung erfordert, werde ich daraus keine allzu große Sache machen.

Von der Bash-Manpage:

Aliase werden nicht erweitert, wenn die Shell nicht interaktiv ist, es sei denn, die Shell-Option expand_aliases wird mit shopt festgelegt (siehe Beschreibung von shopt unter SHELL BUILTIN-BEFEHLE unten).

So könnte man hinzufügen , shopt -s expand_aliasesstatt -i.

Ebenfalls,

Aliase werden erweitert, wenn ein Befehl gelesen wird, nicht wenn er ausgeführt wird.

Da Variablen vor dem Lesen des Befehls nicht erweitert werden, werden sie mithilfe des Alias ​​nicht weiter erweitert.

Kevin
quelle
1
Gut zu wissen. Nur aus Neugier: Warum ist es gefährlich für evalVariablen?
1
@hesse Überlegen eval "echo $1". Sagen wir, ich rufe an ./script.sh "hello;rm -rf ~. Was wird ausgeführt? echo hello, gefolgt von rm -rf ~. Das ist natürlich ein erfundenes Beispiel, aber das Prinzip gilt.
Kevin
Hinzufügen evalvor $1gearbeitet, da ich schon hatte shopt -s expand_aliases. Vielen Dank!
Jayson
1

Ich hatte ein ähnliches Problem und konnte mein Problem lösen, indem ich meine Aliase in Funktionen umwandelte, wie auf dieser Site beschrieben , die für mich funktionierten.

z.B

alias lsd="ls -lash"

zu

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