3 הבדלים בין csh ל bash שאולי לא הכרתם
פוסט זה כולל טיפ קצר על כלי עבודה בסביבת Linux. בשביל ללמוד יותר על עבודה בסביבת Linux ו Unix אני ממליץ לכם לבדוק את קורס Linux שיש לנו כאן באתר. הקורס כולל מעל 50 שיעורי וידאו והמון תרגול מעשי ומתאים גם למתחילים.
כשמגיעים לדבר על שפות מעטפת די ברור ש csh היא הקלה יותר ללמידה אבל היכולות של bash מתקדמות בהרבה. הנה שלוש דוגמאות לרעיון הזה שאולי יעזרו לכם להחליט באיזה שפה לבחור.
1. סריקת קובץ שורה-אחר-שורה
פקודת read של bash היא קסומה. אפשר לקבל קלט מקובץ או מהקלט הסטנדרטי (או מכל file descriptor אחר) וגם לפצל את הקלט למלים. הלולאה הראשונה בקוד הבא קוראת מהמשתמש שורה אחר שורה ומדפיסה חזרה את התוכן עם תחילית. הלולאה השניה קוראת תוכן קובץ ומדפיסה אותו למסך והלולאה השלישית קוראת את הפלט של הפקודה who ושומרת מכל שורה את שתי המלים הראשונות למשתנים.
#!/bin/bash
# Read from STDIN
while IFS= read line
do
echo "> $line"
done
# Read from a file
while IFS= read line
do
echo "$line"
done < /etc/passwd
while read user tty extra
do
echo "$user on $tty"
done < <(who)
ומה לגבי csh ? את הלולאה הראשונה אני לא מכיר דרך טובה לכתוב, אבל הנה הקוד לשתי האחרות:
#!/bin/tcsh -f
foreach line ("`cat /etc/passwd`")
echo ">$line"
end
foreach line ("`who`")
set words = ($line)
echo "$words[1] on $words[2]"
end
2. שערוך פקודות בתוך תנאים והפניית הפלט
בשתי השפות פקודת התנאי מסוגלת להריץ פקודה אחרת ולהחליט על המשך ביצוע הבלוק לפי הצלחה או כשלון של הפקודה שהורצה, למרות שב csh תצטרכו להתאמץ קצת יותר כדי להפנות את הפלט לקובץ. מה שכן ברגע שהתנאים הופכים מורכבים היתרון של bash מתגלה.
נתחיל עם הקוד ב bash. התנאי הראשון בודק אם ynon נמצא ברשימת המשתמשים המחוברים באמצעות grep ו who, ושני האחרים מציגים שילוב שתי פקודות בביטוי תנאי אחד:
#!/bin/bash
if who | grep ynon >& /dev/null
then
echo "ynon is here"
fi
if mkdir foo && cd foo
then
echo ... 1
fi
if mkdir bar && ! cd bar
then
echo ... 2
fi
במעבר ל csh הבלוק הראשון יצטרך עוד כמה סוגריים. את הבלוק השלישי תצטרכו לפצל לשני תנאים:
#!/bin/tcsh -f
if ({ (who | grep ynon >& /dev/null) }) then
echo "ynon is here"
endif
if ({ mkdir foo && cd foo }) then
echo ... 1
endif
if ({ mkdir bar }) then
if ( ! { cd bar } ) then
echo ... 2
endif
endif
3. החלפת טקסט במשתנים
החלפת טקסט במשתנים ב bash יכולה לקרות בתחילת המילה, אמצע המילה וסוף המילה ומשתמשת בסימנים %, / ו # בהתאמה. לכל סימן יש גירסא חמדנית (שמחליפה את ההתאמה הגדולה ביותר) וגירסא מצומצמת. הסקריפט הבא יחליף את הרווחים בשם הקובץ בסימני _ וידפיסו את שם הקובץ (ללא תיקיה) למסך:
#!/bin/bash
name=$1
fname=${name##*/}
dname=${name%/*}
echo mv "$name" "${dname}/${fname// /_}"
וכך זה נראה ב csh:
#!/bin/tcsh -f
set name = "$1"
set fname="$name:t"
set dname="$name:h"
echo mv "$name" "${dname}/${fname:as/ /_/}"
כאן שתי השפות נראות מאוד דומות, אבל הדמיון על פני השטח בלבד. ב bash אתם מקבלים כלים וצריכים לבד לבנות את ההחלפה עבור שם הקובץ והתיקייה. זה יותר מסורבל אבל אם בעתיד תרצו החלפה מסוג אחר לא תהיה בעיה. ב csh אתם מקבלים במתנה את :t ו :h עבור שליפת שם הקובץ או התיקיה מתוך תוכן משתנה. הפעם זה חסך לנו עבודה אבל אם בעתיד נרצה חלק אחר מהמידע תהיה לנו בעיה.