Come forzare l'orologio a funzionare sotto bash


18

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

Puoi dare quale comando effettivamente esegui?
cuonglm,

@Gnouc invece di echo $ 1 ho un po 'di script lungo quindi non lo so ..
Rachid Oussanaa

Voglio dire come hai eseguito il comando ssh?
cuonglm,

@Gnouc ./bin/myfunc.sh
Rachid Oussanaa,

Risposte:


10

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

1
È molto impegnativo per la CPU nel caso in cui la funzione sia definita in.bash_profile
VarunAgw

@VarunAgw, questo è un buon punto. Tuttavia, è un ottimo comando per monitorare le cose in un ambiente in cui il .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; …"
aaiezza,

Funziona solo watch -x bash -c my-funcper me su Ubuntu Server 16.04, mentre altri no.
Nam G VU

14

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!

Solo watch -x bash -c my-funcsì questo lavoro per me su Ubuntu Server 16.04 - mentre altri non lo fanno. Grazie mille!
Nam G VU

4

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
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.