Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

שימוש מתקדם בלינוקס - מדוע סריפט ה BASH נכשל

מייקי - 01/06/2019 - 13:39
נושא ההודעה: מדוע סריפט ה BASH נכשל
שלום,
כצלם בנסיעות, יש לי נייד קטן (וחלש) עם LUNUMTU 18.04 (גרסת 32 - זה מה שהמעבד תומך...) לצורך גיבויי קבצי תמונה לשני כונני SSD מכמה מצלמות.

כתבתי את הסקריפט הבא, וכשאני מנסה להריצו (כמשתמש רגיל) הוא נכשל, בין השאר משום שהוא מנסה לעגן את ה SOURCE וה TARGET שלי תחת מחיצת המשתמש שלי (במקום תחת /).

אשמח לעזרה לגבי נקודה זו, ואם יד עוד בעייות בסקריפט- אשמח שתזהו אותן מראש.

תודה מראש לעוזרים

מייקי

------------הסקריפט----------------
קוד:

#!/bin/bash 
read -p  "Camera:  1-D810, 2-D5500 3-D7500" CAMERA
echo
echo  "Selected $CAMERA"  $CAMERA
case $CAMERA in
[1-1]*)  SOURCE='/media/miki/NIKON\ D810/DCIM/'
;;
[2-2]*)  SOURCE='/media/miki/NIKON\ D5500/DCIM/'
;;
[3-3]*)  SOURCE='/media/miki/NIKON\ D7500/DCIM/'
esac
echo
echo  "Selected source camera is $SOURCE"
echo


TARGET1='/media/miki/SSD_BACKUP1/'
TARGET2='/media/miki/SSD_BACKUP2/'

#cd $SOURCE

echo
pwd
read -p 'Press [Enter] to continue..'
echo
rsync -avW $SOURCE $TRAGET1

echo  SSD_BACKUP1 copied
echo

rsync -avW  .  $TARGET2

echo
echo  "Photos copied   "
echo
echo "remaining space
echo"
df -h | grep home
df -h | grep windows
df -h | grep DCIM
df -h  | grep  /media/miki/SSD_BACKUP1
df -h  | grep  /media/miki/SSD_BACKUP2
#fi
exit



Anonymous - 01/06/2019 - 14:32
נושא ההודעה:
מה בדיוק קורה שם? ניסית להריץ את הסקריפט עם bash -x (או לכתוב בתחילתו set -x)?
מייקי - 01/06/2019 - 14:56
נושא ההודעה: תשובה
תודה צפריר,
הוספתי set -x בתחילה. מתנהג אותו דבר כפי שכתבתי כלuמר ה rsync נכשל ומודיע שאין DIRECTORY ב /home/miki/D7500/DCIM . נראה לי שמקור הבעיה ברווח (שנוצר במצלמה) בין המילה NIKON לבין ה D7500 כי ה rsync נראה כך

קוד:

+ rsync  -avW '/media/miki/NIKON\'  D7500/DCIM/




הוא מנסה ליצור DIRECTORY בשם D7500/DCIM תחת המשתמש /home/miki
וזה בברור לא מה שהתכוונתי.
אשמח לעזרה

תודה
Anonymous - 01/06/2019 - 15:36
נושא ההודעה: עזרה לדבג
מייקי :
שלום,
כצלם בנסיעות, יש לי נייד קטן (וחלש) עם LUNUMTU 18.04 (גרסת 32 - זה מה שהמעבד תומך...) לצורך גיבויי קבצי תמונה לשני כונני SSD מכמה מצלמות.

כתבתי את הסקריפט הבא, וכשאני מנסה להריצו (כמשתמש רגיל) הוא נכשל, בין השאר משום שהוא מנסה לעגן את ה SOURCE וה TARGET שלי תחת מחיצת המשתמש שלי (במקום תחת /).

אשמח לעזרה לגבי נקודה זו, ואם יד עוד בעייות בסקריפט- אשמח שתזהו אותן מראש.

תודה מראש לעוזרים

מייקי

------------הסקריפט----------------
קוד:

#!/bin/bash 
read -p  "Camera:  1-D810, 2-D5500 3-D7500" CAMERA
echo
echo  "Selected $CAMERA"  $CAMERA
case $CAMERA in
[1-1]*)  SOURCE='/media/miki/NIKON\ D810/DCIM/'
;;
[2-2]*)  SOURCE='/media/miki/NIKON\ D5500/DCIM/'
;;
[3-3]*)  SOURCE='/media/miki/NIKON\ D7500/DCIM/'
esac
echo
echo  "Selected source camera is $SOURCE"
echo


TARGET1='/media/miki/SSD_BACKUP1/'
TARGET2='/media/miki/SSD_BACKUP2/'

#cd $SOURCE

echo
pwd
read -p 'Press [Enter] to continue..'
echo
rsync -avW $SOURCE $TRAGET1

echo  SSD_BACKUP1 copied
echo

rsync -avW  .  $TARGET2

echo
echo  "Photos copied   "
echo
echo "remaining space
echo"
df -h | grep home
df -h | grep windows
df -h | grep DCIM
df -h  | grep  /media/miki/SSD_BACKUP1
df -h  | grep  /media/miki/SSD_BACKUP2
#fi
exit



קוד:

#!/bin/bash 
read -p  "Camera:  1-D810, 2-D5500 3-D7500" CAMERA
echo
echo  "Selected $CAMERA"  $CAMERA
case $CAMERA in
[1-1]*)  SOURCE='/media/miki/NIKON\ D810/DCIM/'
;;
[2-2]*)  SOURCE='/media/miki/NIKON\ D5500/DCIM/'
;;
[3-3]*)  SOURCE='/media/miki/NIKON\ D7500/DCIM/'
esac
echo
echo  "Selected source camera is $SOURCE"
echo


TARGET1='/media/miki/SSD_BACKUP1/'
TARGET2='/media/miki/SSD_BACKUP2/'

#cd $SOURCE

echo
pwd
read -p 'Press [Enter] to continue..'
echo
echo $TARGET1
ls $SOURCE $TRAGET1

מציע להריץ מה שרשמתי, ולפרסם את הפלט כאן. מה שרשמתי הוא קיצור של המקור, עם שני שינויים בסופו.

קשור לבחירה של 32 ביט: איזה מעבד יש לך?
Anonymous - 01/06/2019 - 15:36
נושא ההודעה:
שנה את הסטרינגים שלך שיהיו עם מרכאות כפולות ולא יחידות. ז"א:

קוד:
SOURCE="/media/miki/NIKON\ D810/DCIM/"

וכו'.
ובפקודת ה rsync שלך הקף אותם שוב במרכאות כפולות.
קוד:
rsync -avW "$SOURCE" "$TRAGET1"

וכו'.

Dancing
Anonymous - 01/06/2019 - 16:21
נושא ההודעה:
שים לב שאם אתה מחרוזת במרכאות, ה-backslash ישמר. כלומר במקרה:
קוד:

SOURCE="/media/miki/NIKON\ D810/DCIM/"

בעת השימוש במשתנה הוא ינסה לחפש את התיקייה NIKON לוכסן הפוך רווח D810. כנראה תרצה להוריד את \ אם אתה שם מחרוזת במרכאות.
מייקי - 01/06/2019 - 16:59
נושא ההודעה: תודה לכולם!!!
תודה לכולם,

אנסה בערב (כשאגיע למחשב)
מייקי - 01/06/2019 - 23:00
נושא ההודעה: תודה רבה !! נפתר בעזרתכם
תודה רבה במיוחד לאורח.

השימוש במרכאות כפולות והסרץ ה \ אכן פתרו את הבעיה!
Anonymous - 02/06/2019 - 10:41
נושא ההודעה:
הערה אחת, משום שביקשת, פקודת ה-rsync השנייה מעתיקה מהספרייה הנוכחית, כלומר ישנה הנחה מובלעת שהסקריפט מורץ מספרייה מסויימת (אני רואה שיש פקודה cd $SOURCE, אבל היא נמצאת בהערה). זה מחייב את המשתמש להיכנס במפורש לספרייה לפני ההרצה. יכול להיות שזה מכוון, אבל זה פותח פתח לטעויות - אולי עדיף שהסקריפט, אם אפשר, ידאג לזה בעצמו.

דבר נוסף, מה קורה, למשל, אם המשתמש בחר אופציה לא תקינה? במקרה הזה SOURCE לא יהיה מוגדר. תמיד רצוי לבצע בדיקה, למשל עוד שורה ב-case שלוכדת כל דבר (כלומר, תופעל במקרה שאף אחת מהאפשרויות שלפניה לא מתאימות) ובמקרה זה, תתריע למשתמש ותצא מהסקריפט.
כל הזמנים הם GMT + 2 שעות