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 עבור שליפת שם הקובץ או התיקיה מתוך תוכן משתנה. הפעם זה חסך לנו עבודה אבל אם בעתיד נרצה חלק אחר מהמידע תהיה לנו בעיה.