it-swarm.it

Perché il mio script Bash non riconosce gli alias?

Nel mio ~/.bashrc Il file contiene due definizioni:

  1. commandA, che è un alias per un percorso più lungo
  2. commandB, che è un alias di uno script Bash

Voglio elaborare lo stesso file con questi due comandi, quindi ho scritto il seguente script Bash:


#!/bin/bash

for file in "[email protected]"
    do
    commandA $file
    commandB $file
done

Anche dopo essermi disconnesso dalla sessione e aver effettuato nuovamente l'accesso, Bash mi chiede command not found errori per entrambi i comandi quando eseguo questo script.

Che cosa sto facendo di sbagliato?

237
Zaid

Prima di tutto, come diceva ddeimeke, gli alias di default non sono espansi in shell non interattive.

Secondo, .bashrc non viene letto da shell non interattive a meno che non si imposti BASH_ENV variabile d'ambiente.

Ma soprattutto: non farlo! Per favore? Un giorno sposterai quello script da qualche parte dove non sono impostati gli alias necessari e si romperà di nuovo.

Invece imposta e usa le variabili d'ambiente come scorciatoie nel tuo script:

#!/bin/bash

CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh

for file in "[email protected]"
do
    $CMDA "$file"
    $CMDB "$file"
done
125
user601

Se guardi nella manpage di bash trovi:

Gli alias non si espandono quando Shell non è interattivo, a meno che l'opzione Shell expand_aliases sia impostata utilizzando shopt (vedere la descrizione di shopt in Shell COMANDI INCORPORATI di seguito).

Quindi metti a

shopt -s expand_aliases

nella tua sceneggiatura.

Assicurati di fare il sorgente del tuo file alias dopo averlo impostato nel tuo script.

shopt -s expand_aliases
source ~/.bash_aliases
175
ddeimeke

Gli alias non possono essere esportati, quindi non sono disponibili negli script Shell in cui non sono definiti. In altre parole, se li definisci in ~/.bashrc non sono disponibili per your_script.sh (a meno che tu non provenga ~/.bashrc nello script, che non consiglierei ma ci sono modi per farlo correttamente).

Tuttavia, le funzioni possono essere esportate e sarebbero disponibili per gli script Shell eseguiti da un ambiente in cui sono definiti. Questo può essere fatto posizionandolo nel tuo bashrc:

 foo () 
 {
 echo "Hello World!" 
} 
 export -f foo 

Come dice il manuale di Bash, "Per quasi tutti gli scopi, le funzioni Shell sono preferite agli alias".

[cmd line] > bash -i [your script's file path]

i è per interattivo e genera il tuo profilo bash per te.

11
user65576