در اینجا یک نمونه هست:
# POSIX foo=$(dialog --inputbox "text goes here" 8 40 2>&1 >/dev/tty) echo "The user typed '$foo'"
در اینجا تغییرمسیر قدری مهارت آمیز است.
اول جمله foo=$(command) برقرار شده، بنابراین خروجی استاندارد فرمان توسط bash ضبط میشود.
داخل فرمان، قسمت 2>&1 باعث میشودخطای استاندارد به جایی فرستاده شود که خروجی استاندارد میرود-- به بیان دیگر اکنون stderr ضبط خواهد شد.
بخش >/dev/tty خروجی استاندارد را به ترمینال ارسال میکند، بنابراین کادر محاوره توسط کاربر دیده میشود. به هر حال باز هم خطای استاندارد ضبط خواهد شد.
یک سؤال رایج دیگر مرتبط با dialog(1)، آن است که چگونه یک فرمان dialog پویایی شامل اقلامی که باید نقلقولی بشوند(یا به علت آنکه رشتههای تهی هستند، یا به علت دارا بودن فضای سفید درون آنها)، تولید گردد. شخصی میتواند دستور eval را برای این مقصود به کار ببرد، اما پاکیزهترین روش برای رسیدن به این هدف استفاده ازیک آرایه است.
# Bash unset m; i=0 words=(apple banana cherry "dog droppings") for w in "${words[@]}"; do m[i++]=$w; m[i++]="" done dialog --menu "Which one?" 12 70 9 "${m[@]}"
در این مثال، حلقه while که آرایه m را دارای عضو میکند، میتوانست از لوله، فایل، و غیره خوانده بشود.
به یاد بیاورید که ساختار "${m[@]}" به تمام محتویات یک آرایه بسط مییابد، اما با هر عضو صریحاً نقلقول شده. این با ساختار "$@" برای اداره پارامترهای مکانی قابل قیاس است. برای توضیحات بیشتر پرسش و پاسخ شماره 50 را ببینید.
نگارشهای bash جدیدتر دارای ترکیب دستوری به طور جزئی شکیلتری برای افزودن عناصر به یک آرایه میباشند:
# و بالاتر Bash 3.1 نگارش ... for w in "${words[@]}"; do m+=("$w" "") done ...
این هم مثال دیگری با استفاده از نام فایلها:
# Bash files=(*.mp3) # .اینها میتوانند شامل فاصلهها، علامت آپاستروف و غیره باشند cmd=(dialog --menu "Select one:" 22 76 16) i=0 n=${#cmd[*]} for f in "${files[@]}"; do cmd[n++]=$((i++)); cmd[n++]="$f" done choice=$("${cmd[@]}" 2>&1 >/dev/tty) echo "Here's the file you chose:" ls -ld -- "${files[choice]}"
یک عمل مستقل از این پرسش اما مفید dialog، پیگردی نمودن پیشرفت پردازشی است که خروجی را تهیه میکند. در این پایین مثالی هست که از dialog برای پیگردی پردازشهای نوشتن در فایل ثبت وقایع، استفاده میکند. در پنجره dialog، یک کادر تعقیب که خروجی در آن نگهداری میشود و یک کادر پیغام با کلید quit قابل کلیک وجود دارد. کلیک روی کلید quit باعث اجرای trap ، حذف tempfile، و تخریب پردازش تعقیب میگردد.
# POSIX(?) # نمیتوانید فایلی که وجود ندارد را تعقیب کنید بنابراین # همیشه از وجود آن از قبل مطمئن شوید rm -f dialog-tail.log; echo Initialize log >> dialog-tail.log date >> dialog-tail.log tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$ trap 'rm -f $tempfile; stty sane; exit 1' 1 2 3 15 dialog --title "TAIL BOXES" \ --begin 10 10 --tailboxbg dialog-tail.log 8 58 \ --and-widget \ --begin 3 10 --msgbox "Press OK " 5 30 \ 2>$tempfile & mypid=$! for i in 1 2 3; do echo $i >> dialog-tail.log; sleep 1; done echo Done. >> dialog-tail.log wait $mypid rm -f $tempfile
برای یک مثال از ایجاد نوار پیشرفت با استفاده از dialog --gauge, پرسش و پاسخ شماره 44 را ببینید.
پرسش و پاسخ 40 (آخرین ویرایش 2011-01-18 18:55:21 توسط GreyCat)