הרצת פקודה אחרי שהפקודה הנוכחית תסיים בלינוקס

לפעמים אני מריץ משורת הפקודה שורות שלוקחות זמן לביצוע, להוריד קובץ עם wget, לקודד mp3..
והרבה פעמים יש צורך להריץ משהו אחרי שהפקודה הנוכחית תסתיים.

אם זוכרים מראש אפשר להריץ את הפקודות כך:

command1;command2

אבל אז לא היה לי על מה לכתוב – במילים אחרות, בדרך כלל לא זוכרים מראש.
אחת השיטות לעשות את זה היא פשוט לכתוב את הפקודה הבאה ואחריה אנטר, ולהסתמך על התוכנית שלא תעבד את הפקודה, מה שיגרום לה לעבור חזרה למעטפת*.
אני לא אוהב את זה, כי אי אפשר להשתמש ביכולות של המעטפת (השלמת שמות קבצים, הסטוריה) בזמן שתוכנית רצה.
עוד פתרון, הוא לפתוח חלון מעטפת נוסף, ולהריץ שם את הפקודה:

sleep 1m;next command

זה גם לא הכי מוצלח, כי זה דורש שננחש כמה זמן יארך הביצוע של הפקודה הנוכחית (במקרה הזה דקה), וזה גם מעצבן לפתוח עוד מעטפת בשביל זה.
יש פתרון אלטרנטיבי:
להקפיא את הפעולה של התוכנית הנוכחית עם ctrl+z, ולכתוב

fg;next_command

למשל:

$ wget http://server/file.mp3

…. wget downloads the file

ctrl+z

[1]+ Stopped wget http://server/file.mp3

$ fg;lame file.mp3 file2.mp3

… wget continue downloading
… lame encodes the file

$

* מעטפת – Shell – bash for example

Facebook Comments

2 תגובות בנושא “הרצת פקודה אחרי שהפקודה הנוכחית תסיים בלינוקס”

  1. האמת היא שדווקא בדוגמה שנתת אפשר לעשות && כיוון שאין טעם שתרוץ הפקודה השנייה אם הראשונה לא הצליחה 🙂

  2. צודק, אבל לא רציתי לסבך את הדוגמא.
    אני די בטוח שאפשר לדאוג שהפקודה אחרי הfg תרוץ רק אם הפקודה הקודמת חזרה בלי שגיאה, אבל אני צריך לבדוק איך עושים את זה. מה גם שזה יהיה יותר מסובך וזה לא הנקודה.

    עדכון:
    בדקתי, fg מחזיר את הערך שהתוכנית שהוא הביא לחזית החזירה, מה שאומר שאפשר בקלות לכתוב
    fg && lame file.mp3 file2.mp3
    וזה עובד כמצופה.

סגור לתגובות.