Bash Tips
982 subscribers
14 photos
4 files
45 links
רוצים להשתמש בלינוקס אבל לא ממש מכירים את הכלים שהיא מספקת לעבודה?

בערוץ הבא תמצאו אוסף טיפים שימושיים ב-Bash והכרות עם כלים שונים שעשויים לחסוך מאמץ ועבודה בכתיבת סקריפטים ומימוש אוטומציות.
Download Telegram
Forwarded from Deleted Account
טיפ שימושי נוסף שהיה צריך להישלח מזמן
בעבר דברנו על אפשרות להריץ את הפקודה האחרונה שהרצנו על ידי שימוש ב!!
ישנה אפשרות להעביר את הפרמטר האחרון שהעברנו לפקודה על ידי !$

דוגמה
>> /tmp$ mkdir test
>> /tmp$ cd !$
cd test
>> /tmp/test$


במקום להכניס את השם של התיקייה שהרגע יצרתי פשוט העברתי אותו עם !$

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

#terminal_tips
👍2
Forwarded from Deleted Account
אפשר להשתמש ב{} כדי ליצור טווח של מספרים

לדוגמה
echo -e https://webcourse.cs.technion.ac.il/234122/Spring2016/ho/WCFiles/tutorial{0..12}.pdf"\n"
> https://webcourse.cs.technion.ac.il/234122/Spring2016/ho/WCFiles/tutorial0.pdf
https://webcourse.cs.technion.ac.il/234122/Spring2016/ho/WCFiles/tutorial1.pdf
https://webcourse.cs.technion.ac.il/234122/Spring2016/ho/WCFiles/tutorial2.pdf
https://webcourse.cs.technion.ac.il/234122/Spring2016/ho/WCFiles/tutorial3.pdf
...


~$ echo abc{d..x}                                                                                                               

> abcd abce abcf abcg abch abci abcj abck abcl abcm abcn abco abcp abcq abcr abcs abct abcu abcv abcw abcx


echo abc{1..5}                                                                                                         

> abc1 abc2 abc3 abc4 abc5         



#terminal_tips
👍1
Forwarded from Deleted Account
הרצה של פקודה מההסטוריה לפי תוכן שנמצא במחרוזת הפקודה

!? Some string
> less Some string 17463773.txt

#terminal_tips
Forwarded from Deleted Account
לעיתים קורה שאנו מורידים קובץ ולא יודעים לאן הוא ירד או שסתם מעניין אותנו לראות מה קרה במערכת ביממה או בשבוע האחרון

פקודת find מאפשרת לחפש לפי זמן על ידי שימוש בפרמטר -mtime
find ~ -type f -mtime 0 

0 מגדיר את הזמן ממנו אנו רוצים לבצע את החיפוש מה שאומר היום, -3 אומר מלפני 3 ימים.

#terminal_tips
👍1
Forwarded from Deleted Account
בטעות נתקלתי בזה ולא ברור אם זה עובד בכל הטרמינלים
לעיתים אנו צריכים להזין מספר מסויים של תווים ולא משנה לנו מהם, משתמשי פייתון ישר עושים
print "f" * 50 

והופ יש 50 תווים

אפשר לבצע משהו דומה בטרמינל על ידי לחיצה על אלט + מספר (בדוגמה שלנו 50), לאחר מכן התו שתלחצו עליו יוכפל ב50 או במספר אותו הזנתם

(arg: 50)

הקשה על התו המדובר תכפיל אותו במספר הערך שהכנסנו
#terminal_tips
👍1
Forwarded from Deleted Account
טיפ חביב שלמדתי היום

במידה ונרצה לשנות בפלט בצורה קבועה של חלק המחרוזת נוכל להשתמש בסוגריים מסולסלות בצורה הבאה


$ export a=some_file.pdf
$ echo "${a/pdf/jpg}"
some_file.jpg


עכשיו כל מקום שהפלט מכיל את המחרוזת pdf יהפוך להיות jpg

הרעיון המקורי היה להריץ את זה מתוך לולאה, זה נראה כך
for file in *.pdf
do
convert -density 300x300 $file ${file/pdf/jpg}
done


אצלי בקוד הכנסתי את המשתנים לגרשיים כדי להתגבר על בעיית רווחים בשמות קבצים
#terminal_tips
👍1
בעקבות הטיפ הקודם הסתבר שיש עוד הרבה קיצורים כאלו, הנה משהו חביב ישר מהתיעוד, יעבוד מגרסה 4+ ותודה על ההערה
לצורך העניין שם הקובץ הוא bash_hackers.txt

    Get name without extension
${FILENAME%.*}
⇒ bash_hackers
Get extension
${FILENAME##*.}
⇒ .txt
Get directory name
${PATHNAME%/*}
⇒ /home/bash/
Get filename
${PATHNAME##*/}
⇒ bash_hackers.txt


Case modification

array=(This is some Text)

echo "${array[@],}"
⇒ this is some text
echo "${array[@],,}"
⇒ this is some text
echo "${array[@]^}"
⇒ This Is Some Text
echo "${array[@]^^}"
⇒ THIS IS SOME TEXT
echo "${array[2]^^}"
⇒ TEXT

תודה לירון שהרבני על התוספת
#terminal_tips
👍1
סקריפט קצת ישן שבניתי אותו לפני כמה שנים:


#!/bin/bash
# Script to extract files
# Kiewicz
# GPL - 2011


if [ "$#" -lt 1 ]; then
echo -ne "\n\tUsage:"
echo -e "\n\t$(basename $0) <file> (.tar, .rar, .bz2...)"
echo ""
exit 1
fi

if [ -f $1 ] ; then
case $1 in
*.tar.bz2 | *.tbz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.7z) 7z x $1 ;;
*) echo "'$1' cannot be extracted" ;;
esac
else
echo "'$1' is not a valid parameter"
fi

#terminal_tips
👍1
למניעת טעות בלשכתב קובץ:
set -o noclobber 😁

#terminal_tips
👍1
משהו מעניין שגיליתי הרגע: אפשר ליצור שקע בבאש בעזרת הפקודה
exec 3<>/dev/tcp/server/port
ואז לקרוא בעזרת
cat <&3
ולכתוב בעזרת
printf "text" >&3

מקור: http://hacktux.com/bash-socket
קרדיט @BnK970
#terminal_tips
👍1
לאלו שרוצים לדבג עבודה עם curl הרצה עם פרטר -v תציג את הערכים שנשלחו בבקשה ומה התשובה שחזרה.

$ curl  -v ifconfig.io
* Rebuilt URL to: ifconfig.io/
* Trying 102.27.123.121...
* TCP_NODELAY set
* Connected to ifconfig.io (102.27.123.121) port 80 (#0)
> GET / HTTP/1.1
> Host: ifconfig.io
> User-Agent: curl/7.52.1
> Accept: */*
...



#terminal_tips
👍1
Forwarded from ToCode
# טיפ Bash - איך למחוק קבצים בלי נקודה
הרבה אנשים יודעים איך למחוק מהתיקיה את כל הקבצים שיש להם סיומת, ומסתבר שהרבה פחות מכירים את הטריק הבא שימחק דווקא את אלה שאין להם.

קודם כל נוודא שה bash שלנו תומך ב extglob עם הפקודה:

$ shopt extglob
extglob on


אם הפלט אצלכם הוא off יש להפעיל את התמיכה באמצעות:

$ shopt -s extglob


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

$ rm *.*


ולכן כל מה שצריך זה להוסיף סימן קריאה לפני ה glob כדי למחוק את כל הקבצים שאין להם סיומת:

$ rm !(*.*)
אפשר להדפיס תוכן כל קובץ על ידי פקודת cat
$ cat myfilecat
one
two
three

הפקודה מאפשרת לשרשר כמה קבצים לקובץ אחד על ידי
$ cat file1 file2 > file3

אופציית שירשור הקבצים עובדת על עוד פורמטים כמו zip ו mp3.

במידה ונרצה להדפיס קובץ מהסוף להתחלה אפשר להשתמש בפקודת tac (כן, למישהו יש הומור)
$ cat myfilecat
one
two
three

$ tac myfilecat
three
two
one

עכשיו לחלק המעניין, מה לדעתכם יקרה אם נשתמש בtac על קובץ mp3?
פקודת sed להשתמש ב ! במקום \

פקודה מוכרת בעולם הלינוקס היא sed
פקודה שמאפשרת לבצע מניפולציות על טקסט מבלי לפתוח עורך טקסט

הקובץ שלי מכיל את הטקסט הפשוט הבא
$ cat test.txt 
my path is /tmp/test/hello

שימוש בsed מאפשר להחליף טקסט קיים בקובץ ולשמור אותו.
בדוגמה הבאה אני מחליף את המילה hello ב aaa
זה נראה כך
$ sed 's/hello/aaa/g' test.txt 
my path is /tmp/test/aaa

הסינטקס פשוט וקריא, בתחילה אני אומר איזה מילה אני בוחר ולאיזה מילה אני רוצה להחליף. הבעיה מתחילה כשרוצים להחליף תווים מיוחדים למשל אני רוצה להחליף את תו / ל //
זה נראה משהו כזה
$ sed 's/\//\/\//g' test.txt
my path is //tmp//test//hello
לא כיף

במקום לסבול אפשר להשתמש בסינטקס הבא שמחליף את תווי הבקרה בתו אחר
$ sed 's!/!//!g' test.txt
my path is //tmp//test//hello

אז מה היה פה בעצם? החלפנו את השימוש בתו הבקרה / לתו !, הסינקטס קריא יותר וניתן להבנה בקלות גם לבני אנוש
Forwarded from Yuval Meshorer
יש לי עוד אחד חמוד שלא ראיתי פה:

כתבתם קובץ ושכחתם להוסיף לו סיומת? בטח תשתמשו ב-mv, אז תעשו את זה נכון:

$ touch file
$ mv file file.txt
OR
$ touch file
$ mv file{,.txt}


מה שזה עושה זה "מפרק" את הארגומנט למה שבא לפני עם התוספת ובלי:

$ echo a{,b}
a ab
$ echo a{,b,c}
a ab ac
$ echo a{b,}
ab a
$ echo {b,}a
ba a
$ echo {,b}a
a ba
פקודת declare לחיפוש משתנים וערכים במערכת

רוצים לדבג סקריפט ולראות מה type של משתנה מסויים?
ניתן לעשות זאת על ידי שימוש בפקודת declare -p

$ text='some text here'
$ echo $text
some text here
$ declare -p text
declare -- text="some text here"
$ arr=($text)
$ declare -p arr
declare -a arr=([0]="some" [1]="text" [2]="here")

כפי ששמתם לב התשובה שחוזרת כוללת את התווים
declare --
או
declare -a
, זוהי הדרך בה הפקודה מחזירה את היצוג של הערך, אומר שאין הגדרה מסויימת לערך (בבאש אין ערך מוגדר למשתנה על פי תוכן) סימון -a אומר לנו שמדובר על array

לפקודה יש שימוש עיקרי בהגדרת type של משתנים לפני השימוש בהם ואת זה תקראו בהרחבה בגוגל.

דבר נחמד שהפקודה מאפשרת לעשות הוא לחפש ערכים בתוך משתנים שקיימים במערכת או כאלו שכבר יצרנו, זה נראה כך

$ declare | grep some
arr=([0]="some" [1]="text" [2]="here")
text='some text here'

$ declare | grep snap
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
XDG_DATA_DIRS=/usr/share/plasma:/usr/local/share:/usr/share:/var/lib/snapd/desktop
להחסיר מידע לא רלוונטי בפקודת df

פקודת df מאפשרת לנו להציג מידע על כונני האחסון שקיימים במערכת, כמה נפח הם לאיפה הם מעוגנים וכמה נפח נותר בכל כונן.

המידע שהפקודה מחזירה הינו בביטים שפה שפחות בהירה לרובנו, בכדי להציג את נפח האחסון בצורה דבורה אנו מוסיפים את הדגל df -h והתוצאות חוזרות ב mb / gb וכו' איזי פיזי עד כאן כולנו מכירים.

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

פקודת df מאפשרת להחסיר מידע מהתוצאות על ידי דגל -x ומתן שם ה filesystems של הכונן, אם נמשיך עם הדוגמה של סנאפ במידה ונגדיר שלא יוצג תוכן ממערכת קבצים squashfs (מערכת הקבצים שסנאפ משתמשת בה) הפקדה תציג את כל הכוננים מלבד אלו של סנאפ.
בתמונה אחרי ולפני.
להחזיר פלט של פקודה כאילו הוא קובץ

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

בכדי להעביר פלט של פקודה כאילו הוא קובץ כל שיש לעשות הוא להריץ את הפקודה בצורה הבאה (some_command)>, הסוגריים תוחמות את הפקודה והאופרטור > מעביר את הפלט (stdout) של הפקודה בסוגריים כקלט (stdin) לפקודה שהורצה, למשל הפקודה הלא שימושית הבאה שפשוט תעביר קלט לפקודת cat
cat <(df -h)

אותו רעיון יעבוד לנו גם עם פקודת diff במידה ונעביר את הפלט של הפקודות שלנו כאילו הן קלט/קריאה מקובץ נוכל להשתמש ב diff להשוואות תוצאות של פקודות
diff <(df -h -x ext4) <(df -h)
הצגת פלט קריא בפקודת diff

פקודת diff עליה דיברנו בעבר מציגה הבדלים בין קבצים, הפלט בוא היא מציגה את ההבדלים מתומצת ופחות קריא למי שאינו מורגל בכך

הרצה של פקודת diff -y תציג את שני הקבצים במקביל כך שהשינויים מוצגים בצורה בהירה יותר זה נראה כך