Il problema è che quando l'orologio viene eseguito funziona she 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 she 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. watchesegue 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 func1uno script da solo e chiamarlo.
In breve, prova:
watch bash -c func1
.bash_profile
.bash_profilefile è relativamente vuoto. Tuttavia, volevo eseguire un alias che era nel mio .bash_aliasesfile ( proveniente da mio.bashrc ), quindi ho finito per aggiungere anche il -iflag a bash. Ho pensato che potesse aiutare qualcuno:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-funcper 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/sha /bin/bash(o alla shell corrente), è possibile watchindicare di eseguire la shell utilizzando -xo --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/shper generare il processo figlio (in questo caso, bash), mantenendo bashfino 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-funcsì questo lavoro per me su Ubuntu Server 16.04 - mentre altri non lo fanno. Grazie mille!
Perché correre watchdall'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