Il problema è che quando l'orologio viene eseguito funziona sh
e ottengo questo errore:
sh: 1: func1: not found
ecco il codice:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
Il problema è che quando l'orologio viene eseguito funziona sh
e ottengo questo errore:
sh: 1: func1: not found
ecco il codice:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
Risposte:
Ok, quindi ci sono alcuni problemi con il tuo approccio.
Si sta esportando una funzione, che non è portatile tra le shell. watch
esegue i suoi comandi con /bin/sh
, che sul tuo sistema non lo è bash
. E qualunque shell sia, non rispetta le esportazioni di funzioni, quindi ottieni l'errore.
In secondo luogo, puoi cambiare il tuo comando in qualcosa del genere watch bash -c 'func1'
, ma questo potrebbe non funzionare neanche bene.
Il motivo è che le variabili impostate dallo script non saranno disponibili per la funzione. Potresti essere in grado di esportare quelli di cui ha bisogno, ma questo inizia a diventare disordinato.
La soluzione più sicura è quella di inserire func1
uno script da solo e chiamarlo.
In breve, prova:
watch bash -c func1
.bash_profile
.bash_profile
file è relativamente vuoto. Tuttavia, volevo eseguire un alias che era nel mio .bash_aliases
file ( proveniente da mio.bashrc
), quindi ho finito per aggiungere anche il -i
flag a bash. Ho pensato che potesse aiutare qualcuno:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-func
per me su Ubuntu Server 16.04, mentre altri no.
La shell predefinita per watch
è /bin/sh
. Le shell non erediteranno le variabili o le funzioni esportate da altri tipi di shell.
Se il sistema in uso non esegue il collegamento simbolico /bin/sh
a /bin/bash
(o alla shell corrente), è possibile watch
indicare di eseguire la shell utilizzando -x
o --exec
:
watch -x bash -c "my_func"
o
watch --exec bash -c "my_func"
Questo è diverso da watch bash -c "test_watch"
(escluso il --exec
) in quanto non viene utilizzato /bin/sh
per generare il processo figlio (in questo caso, bash
), mantenendo bash
fino in fondo. Come indicato in altre risposte, ciò può diventare disordinato se si esportano funzioni che sono altamente accoppiate all'ambiente attuale (cioè che richiedono altre variabili o funzioni).
Un esempio:
test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"
dà il familiare
Every 2.0s: bash -c test_watch Thu Mar 31 11:15:56 2016
Working!
watch -x bash -c my-func
sì questo lavoro per me su Ubuntu Server 16.04 - mentre altri non lo fanno. Grazie mille!
Perché correre watch
dall'interno della tua sceneggiatura? Perché non avere questo script di shell:
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
... e poi eseguilo così ...
$ watch func1 foo