Bash: usa un alias in una variabile


9

Sto scrivendo uno script bash che esegue ciascuno dei suoi argomenti come comando. Questo funziona per i comandi nel mio PATH, ma non per gli alias. Posso chiamare direttamente un alias nello script, ma non posso chiamare un alias che è stato passato come argomento.

Il problema (presumo) è che gli alias vengono espansi prima delle variabili. C'è un modo per eseguire gli alias da una variabile?

Script di esempio:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

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

runall "echo test"funziona, ma runall "myalias"runall: line 8: myalias: command not found

Risposte:


9

Dopo alcuni test, ho concluso quanto segue:

  • Gli alias funzionano solo in modalità interattiva (aggiungi -iallo shebang).
  • Gli alias non vengono valutati quando provengono da una fonte interpretata (in questo caso, la variabile.
  • Puoi ottenere bash per usare l'alias con eval $1. Si noti che evalqualsiasi cosa creata con una variabile è pericolosa, ma poiché l'intero punto dello script richiede un'esecuzione arbitraria, non ne trarrò un grosso problema.

Dalla pagina man di bash:

Gli alias non vengono espansi quando la shell non è interattiva, a meno che l'opzione di shell expand_aliases sia impostata utilizzando shopt (vedere la descrizione di shopt sotto COMANDI INCORPORATI SHELL di seguito).

Quindi potresti aggiungere shopt -s expand_aliasesinvece di -i.

Anche,

Gli alias vengono espansi quando viene letto un comando, non quando viene eseguito.

Poiché le variabili non vengono espanse prima della lettura del comando, non verranno ulteriormente espanse utilizzando l'alias.


1
Bello sapere. Solo per curiosità: perché è pericoloso per le evalvariabili?

1
@Hesse Consider eval "echo $1". Di 'che chiamo ./script.sh "hello;rm -rf ~. Cosa viene eseguito? echo hello, seguito da rm -rf ~. Ovviamente questo è un esempio inventato, ma il principio vale.
Kevin,

aggiungendo evaldavanti ha $1funzionato, dal momento che avevo già shopt -s expand_aliases. Grazie!
Jayson,

1

Ho avuto un problema simile e sono riuscito a risolvere il mio problema trasformando i miei alias in funzioni, come descritto in questo sito , che ha funzionato per me.

per esempio

alias lsd="ls -lash"

per

function lsd() { ls -lash; }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.