2009-11-10 19 views
5

Mam skrypt powłoki z wieloma instrukcjami echa. Chcę poprzedzić każdą linię danych wyjściowych datą/godziną.Prefixing logi z datą w skrypcie powłoki

Więc otrzymuje każdy

echo "Some text1" 
echo "Some text2" 

z

echo "`date +%y/%m/%d_%H:%M:%S`:: some text1" 
echo "`date +%y/%m/%d_%H:%M:%S`:: some text2" 

jest to raczej brzydki. Czy istnieje mimo to utworzenie aliasu (lub analogu do # definicji w C), aby uczynić go czystszym.

Oczywiście, robi coś takiego:

DATE=`date +%y/%m/%d_%H:%M:%S` 
echo "$DATE:: some text1" 
echo "$DATE:: some text2" 

... nie będzie działać, ponieważ w tym przypadku data jest obliczana tylko raz i każdy echo miałby tę samą datę.

Zastanawiam się nad zastąpieniem każdego echa wywołaniem funkcji drukowania, które wykonuje prefiks. Chcę wiedzieć, czy ktoś ma jakieś inne/lepsze pomysły.

Odpowiedz

12
echodate() 
{ 
    echo `date +%y/%m/%d_%H:%M:%S`:: $* 
} 

echodate Some text 1 
echodate Some text 2 
4

Jeśli używasz bash ...:

#!/bin/bash 

function myecho() { 
     echo "`date +%y/%m/%d_%H:%M:%S`:: [email protected]" 
} 

myecho "hola" 
+1

Lepiej użyć '$ *' zamiast '$ @ 'wewnątrz większego ciągu (ponieważ jest to kontekst, w którym zachowanie" $ @ "' jest podzielone na arg-per-member jest aktywnie niepożądane) i lepiej używać składni deklaracji funkcji POSIX bez konkretnego powodu być z nią niezgodnym. –

3

Tak, funkcja powłoki lub odwrotnie użyć aliasu:

alias now="date +%s" # or your specific date format 
echo "`now` some text" 
3
#!/bin/bash 
echo() { 
    printf "`date`: $1\n" 
} 

echo "test" 

-

spowoduje:

abi @ cefix: ~ $ sh test.sh

ks 18. Sty 13:33:35 CET 2011: test

więc nie trzeba zmienić wszystkie echa oświadczenia.

1

Lub po prostu zapisać w formacie:

format="+%y/%m/%d_%H:%M:%S::" 
echo $(date $format) some text 

Nie tyle cytowanie jest potrzebne, btw.

-1

Jeśli używasz Korn Shell (KSH) Tutaj jest funkcją:

#** Description: Logs stringToLog to scriptLog using a standard date format. 
#** Parameters: ${1} stringToLog (Required) 
#**    ${2} scriptLog (Required) 
log() { 
     echo "[`date +'%Y/%m/%d %H:%M:%S%s'`]: ${1}" >> "${2}" 
} 

Przykład wywołania powyższą funkcję:

log "Starting foo script." "${PWD}/logs/foo.log" 
Powiązane problemy