منبع اصلی نوشتار زیر در این لینک قرار دارد

پرسش و پاسخ شماره ۳۲


پرسش و پاسخ‌های رایج Bash  در Greg\'s Wiki

پرسش و پاسخ شماره ۳۲

چطور می‌توانم خروجی \'time\' را به یک متغیر یا فایل تغییر مسیر بدهم؟

کلمه کلیدی 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      # پیغام را اخذ می‌کند


CategoryShell

پرسش و پاسخ 32 (آخرین ویرایش ‎ 2012-04-20 04:39:57 ‎ توسط e36freak)




به سیاره لینوکس امتیاز دهید

به اين صفحه امتياز دهيد