2015-07-27 11 views
6

Nella mia shell di script una funzione che stampa un messaggio sulla console. Può essere chiamato da qualsiasi altra funzione.Come echo direttamente sullo standard output all'interno di una funzione shell?

function print_message 
{ 
    echo "message content" 
} 

Il problema è, in guscio, funzioni come echo o printf che di solito stampano i dati sullo standard output reindirizzare i loro messaggi alla funzione di chiamata invece come valore di ritorno.

return_value=$(print_message) # this line print nothing. 
echo $return_value # this line print the message. I don't want to have to do it. 

Vorrei evitare questo comportamento e stamparlo direttamente su standard - o errore - output. C'è modo di farlo ?

O sono solo sbagliato a voler utilizzare le funzioni in shell e dovrei usare invece un copione enorme per gestire qualsiasi comportamento?

+2

si desidera che l'output di 'print_message' per andare errore standard? Sempre? Reindirizzare la funzione quindi "echo" contenuto del messaggio "> & 2'. –

+0

@EtanReisner - Sembra che lo vogliano sugli errori standard out * e * standard. STDOUT quindi è catturato da '$ (...)' e STDERR quindi viene mostrato sullo schermo. –

+0

@EtanReisner Che funziona per errore standard, ma esiste un modo per stamparlo sullo standard output? '> & 1' non sembra funzionare. – Aracthor

risposta

11

La sintassi di chiamata $(...) acquisisce l'output standard. Questo è il suo lavoro. Questo è quello che fa.

Se si desidera che i messaggi statici non vengano rilevati da quello, è possibile utilizzare l'errore standard (anche se non farlo per cose che non sono messaggi di errore o di debug, ecc.).

Non è possibile avere una funzione che emetta sullo standard output ma che non viene catturata dal contesto $(...) in cui è in esecuzione perché esiste un solo flusso di output standard. Il meglio che potresti fare sarebbe rilevare quando hai un terminale di controllo/ecc. e scrivere direttamente a quello invece (ma non consiglierei di farlo anche per la maggior parte del tempo).

Per reindirizzare completamente l'errore standard per la funzione, è possibile eseguire una di queste opzioni.

print_message() { 
    echo "message content" >&2 
} 

o

print_message() { 
    echo "message content" 
} >&2 

La differenza è irrilevante quando c'è solo una linea di uscita, ma se sono presenti più linee di uscita, allora quest'ultimo è suscettibile di essere leggermente più ottimizzato (specialmente quando l'uscita flusso sembra essere un file).

Evitare anche la parola chiave function in quanto non è POSIX/spec e non è così ampiamente portatile.

-1

Invocare print_message in $ (...) reindirizza l'output. Se non si desidera reindirizzare l'output, richiamare il comando senza $ (...). Per esempio.

return_value=print_message # this line print nothing. 
echo $return_value # this line print the message. I don't want to have to do it. 

Nota: il valore restituito dalla funzione fornita sarà ora il nome della funzione.

+2

Questo non richiama 'print_message' affatto. Questo stamperà 'print_message' come risultato della linea' echo'. –

+0

Funziona per me e quello che sto leggendo online dice che è sufficiente inserire il nome della funzione per invocarla. Ad esempio, 'funzione visualizza_messaggio { echo "contenuto del messaggio" } visualizza_messaggio print_message' Stampa l'uscita due volte. – cacciatc

+0

Non può funzionare per te. Provalo di nuovo e assicurati che la tua funzione restituisca qualcosa * altro * di 'print_message'. Sì, il nome di per sé è sufficiente per chiamare una funzione in una posizione in cui ciò accade ma "return_value = print_message' è ** non ** una posizione in cui ciò accade. Vedi http://ideone.com/dnEvPA –

1

Si sta dicendo esplicitamente "non stampare direttamente l'output! Inseriscilo in una variabile in modo che possa stamparlo da solo!".

si può semplicemente di non farlo, e il messaggio verranno stampati automaticamente:

$ cat yourscript 
#!/bin/bash 

function print_message 
{ 
    echo "message content" 
} 

print_message 

$ ./yourscript 
message content 
+0

Grazie per il suggerimento. Non posso usarlo in questo caso perché ho bisogno di memorizzare il valore di ritorno della mia funzione, ma terrò a mente questa tecnica. – Aracthor

Problemi correlati