L'esecuzione di cd in una funzione di bash chiamata da subshell causa un output estraneo

2

Considera la funzione bash:

func() {
  cd /;
  echo test;
}

Chiamarlo fa quello che ti aspetti:

~:>func
test
/:>

Ma quando chiamato da una subshell (es. usando backticks o $ ()) si comporta in modo molto strano.

~:>func() { cd /; echo test; }
~:>echo $(func)
test Saving session... ...saving history...truncating history files... ...completed.
~:>

Questo problema non appare se cd non viene eseguito nella funzione:

~:>func() { echo test; }
~:>echo $(func)
test
~:>

Questo sta causando problemi con alcuni script che si basano su determinati comportamenti di output, ad esempio CLASSPATH=$(func) dove func è complesso e richiede l'uso di cd .

Ciò che è strano è che questo ha funzionato bene prima. Non è iniziato a succedere fino a poco tempo fa, ma non so cosa lo avrebbe causato.

Nota: alias cd riporta "alias: cd: not found" e which cd restituisce / usr / bin / cd, che è uno script identico a un altro Mac che non ha il problema.

    
posta Ed Marty 13.01.2017 - 20:58
fonte

1 risposta

1

Sembra che ci sia qualcosa di strano in corso poiché cd non è definito per comportarsi come tu lo stai vedendo. Le prove suggeriscono che la definizione sia stata superata da qualche parte.

È possibile che il tuo comando cd sia alias da qualche parte. Il comando alias senza argomenti mostrerà una lista di comandi con alias sulla maggior parte delle shell. Una soluzione alternativa per un comando con alias è la prefazione del comando con una barra rovesciata ( \cd ). Che cita la prima lettera del comando e sconfigge qualsiasi elaborazione di alias da parte della shell.

È anche possibile che sia una funzione di shell. declare -f dovrebbe elencare le funzioni definite, almeno in bash , e puoi vedere se cd è definito come una funzione.

Con un po 'di fortuna, il tuo comando which può supportare i modi più corti per eseguire questi controlli. Controlla questa pagina man on-line per come una implementazione di which può essere utilizzata per controllare funzioni e alias , quindi verifica se il tuo which funziona in modo simile.

    
risposta data 14.01.2017 - 06:01
fonte

Leggi altre domande sui tag