کلمه کلیدی time در پوسته Bash نیرنگ خاصی را به کار میبرد، به طوری که میتوانید مواردی مانند این را انجام دهید
time find ... | xargs ...
و به جای فقط فرمان ساده در ابتدای لوله، زمان اجرای تمام لوله را، به دست میآورد. (این به دلایل روشن با رفتار فرمان خارجی time(1) متفاوت میباشد.)
به این دلیل، کسانی که میخواهند خروجی time را تغییر مسیر بدهند غالباً در معین کردن آنکه انواع توصیفگرهای فایل به کجا میروند، با دشواری مواجه میگردند. گرچه آنطوری هم که اکثر افراد فکر میکنند دشوار نیست، --ترفند آن فراخوانی time در یک پوسته فرعی یا بلوک، و سپس گرفتن stderr پوسته فرعی یا بلوک میباشد(که شامل نتایج time است). اگر احتیاج دارید که خروجی یا خطای استاندارد واقعی فرمان را تغییر مسیر بدهید، آن را در داخل پوسته فرعی یا بلوک انجام دهید. برای نمونه:
bash -c "time ls" 2>time.output # صریح، اما بیکفایت ( time ls ) 2>time.output # به طور جزئی مؤثرتر { time ls; } 2>time.output # مؤثرترین # :حالت کلی { time some command >stdout 2>stderr; } 2>time.output
foo=$( bash -c "time ls" 2>&1 ) # هر چیزی را اخذ میکند foo=$( { time ls; } 2>&1 ) # نسخه کارآمدتر # میشود stdout مانع آزار رساندن exec 3>&1 foo=$( { time bar 1>&3; } 2>&1 ) # خطای استاندارد و زمان را اخذ میکند exec 3>&- # میشود stdout و stderr مانع مزاحمت هر دو خروجی exec 3>&1 4>&2 foo=$( { time bar 1>&3 2>&4; } 2>&1 ) # فقط زمان را اخد میکند exec 3>&- 4>&- # exec همانطور و بدون استفاده از { foo=$( { time bar 1>&3- 2>&4-; } 2>&1 ); } 3>&1 4>&2
ساختار مشابهی برای اخد پیغامهای "core dump" میتواند استفاده شود، که در حقیقت توسط پوستهای که برنامه را شروع کرده، چاپ میشوند، نه به وسیله همان برنامهای که فایل core آن از حافظه تهیه میشود:
./coredump >log 2>&1 # در گرفتن پیغام ناموفق است { ./coredump; } >log 2>&1 # پیغام را اخذ میکند
پرسش و پاسخ 32 (آخرین ویرایش 2012-04-20 04:39:57 توسط e36freak)