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

בערוץ הבא תמצאו אוסף טיפים שימושיים ב-Bash והכרות עם כלים שונים שעשויים לחסוך מאמץ ועבודה בכתיבת סקריפטים ומימוש אוטומציות.
Download Telegram
רמת קושי: #advanced

פוסט נהדר של ינון פרק
אני מדביק כאן את הלינק לפוסט כי הדיון בתגובות פשוט מעניין

https://t.me/c/1217780911/5892

#cal
#ncal

@bash_tips
רישום למערכת
אתחול מעטפת

ישנן שני אפשרויות כניסה של משתמש למערכת, האחת טוענת את כל הסביבה של המשתמש, ומוכרת בשם login shell.
והאחרת פשוט מחליפה את המשתמש אבל לא טוענת את כל הסביבה, מוכרת בשם non login shell.

כניסה רגילה למערכת טוענת את כל סביבת המעטפת, ומחפשת לטעון את הקבצים שברשימה אם הם קיימים, ברגע שאחד מהם זוהה האחרים לא יטענו פרט לקובץ /etc/bashrc שיטען תמיד

/etc/profile
~/.bash_profile
~/.bash_login
~/.bashrc

מצד שני אם מחליפים משתמש על ידי su לא כל הסביבה של המשתמש שהוחלף נטענת, והקבצים שיטענו הן רק

/etc/bashrc
~/.bashrc

בכדי לטעון משתמש אחר עם su ולטעון את כל הסביבה שלו ציך לציין זאת במפורש על ידי דגל -l או על ידי הקיצור שלו שמוכר יותר su -

$ su -l
$ su -

אם כן למדנו טריק נחמד, ברגע שרוצים לטעון מחדש את סביבת המשתמש בלי לעשות login logout, ניתן פשוט להריץ

$ su - user

ישנן עוד השפעות non shell login כגון משתני סביבה שלא מוגדרים
עוד מידע בנושא ניתן למצוא ב man bash INVOCATION

@learnlinuxnote
Bash Tips
bash_tips-stop_recursion.sh
רקורסיה $0 $$, ושני אתגרונים בקצה
רמת קושי: #advanced

בעבר דברנו על כך שכשמעבירים לסקריפט באש פרמטרים אז הם נכנסים לסקריפט כמשתנים בשמות $1 לפרמטר הראשון ו$2 $3 לשני והשלישי בהתאמה וכו', מצליחים לנחש איזה ערך נמצא במשתנה $0?

$ cat test.sh
echo "$0"

$ ./test.sh
./test.sh

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

$ cat test.sh
echo "$0 | $$"
sleep 20
$0

$ ./test.sh
./test.sh | 101394
./test.sh | 101395
./test.sh | 101396
...

מה היה לנו כאן בעצם?
$0 מעביר את שם הסקריפט
$$ מציג את מספר התהליך של הסקריפט
הסקריפט נח ל20 שניות ומריץ את עצמו שוב

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

אתגרונים אתגרונים
ועכשיו לשני אתגרים קטנים שתשתגעו עליהם.

1. איך לגרום לסקריפט החדש שרץ ($0) להחליף את מספר התהליך שלו מבלי להיות תת תהליך של התהליך המקורי ובכך לגרום לסקריפט המקורי להגיע לנקודת סיום ולשחרר את הזיכרון.

2. איך לסגור את הסקריפט הפשוט הבא (הקובץ המצוטט בערוץ) כשאתם מריצים אותו ברקע כך

$ ./bash_tips-stop_recursion.sh &


תוכן הקובץ
$ batcat bash_tips-stop_recursion.sh
───────┬────────────
│ File: test.sh
───────┼────────────
1 │ #!/bin/bash
2 │
3 │ echo "$0 | $$"
4 │ sleep 1
5 │ $0


מוזמנים לשתף בתגובות מה דגתם

#challenge
#arguments
#bash_pid


@bash_tips
Bash Tips
נענים לאתגר רמת קושי: #advanced האתגר הבא מבוסס על סיפור אמיתי, כמו רוב הטיפים בערוץ 😊. קובץ זיפ הבא מכיל רשימת קבצי דמה PDF של אקורדים לגיטרה בשמות עבריים, שמות הקבצים מורכבים משם הזמר ושם השיר (לרוב), חלק משמות הקבצים הן עם רווח והאחרים עם . או עם _ כמפריד…
פתרון האתגר סדר בחדר
רמת קושי: #beginners

משימה ראשונה
בואו נציץ לרגע במשימה הראשונה של האתגר ונראה מהי.

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

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

וזה בדיוק מה שעושה הקוד הבא

1 for file in *;
2 do
3 sed_expr='s/^[[:punct:][:space:]]//g ; s/[_,-]/ /g'
4 dest="test/$(echo "${file}" | sed "$sed_expr" | cut -f 1-2 -d ' ' )"
5 mkdir -p "$dest"
6 cp "$file" "$dest"
7 done

שורה 1: אוספת את כל הקבצים שבתיקייה ומעבירה קובץ קובץ לעיבוד.
שורה 3 ו 4: מעבירה את שם הקובץ את התהליך הבא שמורכב מ3 חלקים

1. מעבירה את שם הקובץ הבא לפקודת sed
שמחה_פרידמן_עוד_יבוא_היום_אקורדים_קלים.pdf


2. פקודת sed מריצה שני עיבודים כדי ליצור סטנדרט בין כל הקבצים (; הוא חוצץ בין שני הביטויים)
שלב א' היא מסירה את כל התווים המיוחדים והרווחים שמופיעים בתווים הראשונים של הקובץ .
שלב ב' היא מחליפה את תווי _ , - ברווח.
מה שמביא אותנו למצב ששם הקובץ כרגע הוא כך
שמחה פרידמן עוד יבוא היום אקורדים קלים.pdf

3. בחירה של 2 המילים הראשונות, איך זה קורה?
פקודת cut מקבלת פרמטר לפיו היא מפצלת מילים על פי רווח,
ואז אנו מעבירים טווח של מילים אותם אנו רוצים לשלוף, 1-2 אלו שני המילים הראשונות.

אז כרגע בסופו של תהליך שורה 3 נראית כך
dest="test/שמחה פרידמן"

מפה זה די פשוט וקל
שורה 5: יוצרת תיקיית על שם הזמר.
שורה 6: מעתיקה את השיר לתיקייה שכרגע נוצרה.

התוצאה היא רשימת תיקיות שמכילות את שני המילים הראשונות של הקבצים.
קבצים שיש להם את אותם 2 מילים בראש הקובץ מקובצים תחת אותה תיקייה.


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

#challenge
#loops
#sed
#cut

@bash_tips
Bash Tips
נענים לאתגר רמת קושי: #advanced האתגר הבא מבוסס על סיפור אמיתי, כמו רוב הטיפים בערוץ 😊. קובץ זיפ הבא מכיל רשימת קבצי דמה PDF של אקורדים לגיטרה בשמות עבריים, שמות הקבצים מורכבים משם הזמר ושם השיר (לרוב), חלק משמות הקבצים הן עם רווח והאחרים עם . או עם _ כמפריד…
פתרון האתגר סדר בחדר
משימה שניה
רמת קושי: #beginners

החלק השני של המשימה הוא
להצליח להתגבר על קבצים ששם הזמר נמצא בסוף שם הקובץ.

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

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

הקוד שמריץ את התהליך הזה פשוט אף הוא והוא נראה כך

7 for dir in test/*;
8 do
9 dirname="${dir/ /*}"
10 find test/* -type f -path "*${dirname##*/}*" -exec mv {} "$dir" \;
11 done
12 rmdir test/*

אחרי שהסברנו מה הרעיון שהקוד בא לממש, נעבר לראות איך זה קורה בפועל
שורה 7: אוספת את כל שמות התיקיות שנמצא תחת תיקיית העבודה שיצרנו (test)

test/שמחה פרידמן

שורה 9: מחליפה את הרווח בכוכבית, למה אתם שואלים? כי regex זה חשוב.
ובעצם יוצא שכך נראה כרגע התוכן של משתנה dirname
test/שמחה*פרידמן

שורה 10: מבצעת 2 פעולות
1. לוקחת את שם הזמר בדוגמה שלנו הוא שמחה*פרידמן ומחפשת קבצים שנושאים את שם שלו תחת הנתיב test
הנתיבים שאנו מקבלים נראים כך

test/שמחה פרידמן/שמחה_פרידמן_עוד_יבוא_היום_אקורדים_קלים.pdf

החיפוש נעזר בregex, זוכרים את ה * ממקודם? אז כאן היא באה לידי שימוש ו find מקבל את המחרוזת ה regex הבאה *שמחה*פרידמן* ומחפש אותה בנתיב של הקבצים כמו זה שראינו שלעיל, זה מביא לידי כך שלא משנה אלו תווים יש לפני ואלו תווים יש אחרי או אפילו באמצע המחרוזת, שם הזמר תמיד יהיה מזוהה.

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

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


זהו עד כאן משימה שניה של האתגר

התיקיות לא מסודרות עדין 100% כי יש זמרים ששמם מופיע בסוף הקובץ מבלי שיהיו להם קבצים ששם הזמר מופיע בתחילתם, עוד קבצים אחרים שאינם נושאים שם זמר וכו' אבל 95% עבודה נעשתה, כנראה שזהו שלב 20/80 במצב שלנו.
#challenge
#find
#loop
#rmdir

@bash_tips
לקבל את רשומי המערכת getent

לינוקס מלאה בקבצים שמכילים מידע על משתמשים, תהליכים, הגדרות וכו', במקום לרוץ ולאסוף את כל המידע הזה ולזכור היכן הוא ממוקם ישנה פקודה שמנגישה את המידע, קובץ ההגדרות נמצא בנתיב /etc/nsswitch.conf ומאפשר להגדיר מהיכן לאסוף את המידע, להלן רשימת המידע אותו היא מספקת ברירת מחדל

$ getent --help
...
Supported databases:
ahosts ahostsv4 ahostsv6 aliases ethers group gshadow hosts initgroups
netgroup networks passwd protocols rpc services shadow
...

בכדי לקבל מידע במלואו ניתן להריץ

$ getent hosts 
127.0.0.1 localhost
192.168.39.12 myrancher.com
178.62.121.30 playground


או לבחור לקבל מידע על ערך ספציפי

$ getent services 67
bootps 67/udp

$ getent services git
git 9418/tcp

@learnlinuxnote
Forwarded from Alex M. Schapelle
לכל אוהבי באש ואוכל :
https://gitlab.com/lpi-devops/bash_cuisine
הכיף הזה לגלות עוד ערוצים עם תוכן איכותי

הקבוצה https://t.me/vim_users
הערוץ https://t.me/vim_tips
👍1
טיפ נהדר של @dank3y והזוית של באש
רמת קושי: #advanced

משתמשי Zsh

אם אתם על הטרמינל כותבים פקודה כלשהי, מעבר לשימוש ב-vi mode של zsh כדי לערוך אותה,
לחיצה על ctrl + e (או מקש אחר לבחירתכם) תביא אתכם ל- vim על מלא בו תוכלו לערוך את הקוד ממש כאילו היה מיני סקריפט שלכם.
כשתסיימו תוכלו לשגר אותו ל-prompt שלכם עם שמירה ויציאה כמו שאתם מכירים.

נדרש רק להוסיף את שתי השורות האלו לקובץ .zshrc שלכם:

autoload edit-command-line; zle -N edit-command-line
bindkey '^e' edit-command-line


משתמשי Bash

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

Ctrl + X
Ctrl + E


בשני המקרים העורך שיפתח הוא העורך שמוגדר למשתנה הסביבה $EDITOR

#editor

@bash_tips
👍1
חיפוש grep
רמת קושי: #advanced

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

לבצע חיפוש על טקסט ללא רגישות ל case sensitive

$ grep -i "name" file
name: test
Last Name

שימוש בדגלי A / B / C יאפשר לנו להגדיר שלא רק השורה שתואמת את הביטוי תוצג, אלא גם אלו שסביבה, A יחזיר את השורות הבאות לאחר השורה שנמצאה בה התאמה לביטוי, B יחזיר את השורות שקדמו לשורה התואמת לביטוי, C יציג בשווה שורות לפני ואחרי

$ grep -A2 "three" /tmp/test
three
four
five

$ grep -B2 "three" /tmp/test
One
two
three

$ grep -C2 "three" /tmp/test
One
two
three
four
five

הוספת מספרי שורות לתוצאות בהם נמצאה ההתאמה

$ grep -n "three" /tmp/test
3:three

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

$ grep -v "three" /tmp/test
One
two
four
five

בכדי לקבל פונקציולניות מתקדמת ל regex כמו lookbehind, ניתן להשתמש במנוע הregex שתואם את perl, מוכר גם בשם PCRE

$ grep -P

ברירת מחדל grep יחזיר את כל השורה בה נמצא מילה התואמת לביטוי, בכדי לשלוף רק את הרצף שתואם לביטוי ניתן להשתמש בדגל -o

$ grep name Chart.yaml
name: Test

grep -o name Chart.yaml
name

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

$ grep -r "NodePort" sonarqube
sonarqube/k8s/sonarqube-service.yml: type: NodePort
test_env/k8s/backend-service.yml: type: NodePort

בכדי לקבל רק את הנתיב לקובץ שתואם לביטוי, ניתן להשתמש בנוסף בדגל -l

$ grep -rl "NodePort" sonarqube
sonarqube/k8s/sonarqube-service.yml
test_env/k8s/backend-service.yml

וכמובן שאפשר לקבל רק את הקבצים שאינם מכילים את הביטוי על ידי דגל -L

$ grep -rL "NodePort" sonarqube

וכן אתם לא טועים אפשר לממש את אותו הרעיון עם דגל v

$ grep -rlv "NodePort" sonarqube

#grep

@bash_tips
להעביר מידע רגיש read
רמת קושי: #beginners

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

בכדי להימנע מהמצב דומה ניתן להשתמש בדגל -s לפקודת read, האופציה הזאת מאפשרת לקבל מידע לתוך משתנה מבלי להציג אותו למשתמש.

$ read -s PASS

[המערכת שומרת כל קלט שנכנס עד שהוא יאושר עם אנטר]

$ echo $PASS
123123123

#read

@bash_tips
Forwarded from V0id
להציג את הקבצים בתקייה הנוכחית עם נתיב אבסולוטי
find "$PWD" -maxdepth 1
כדי להפוך את זה לפשוט יצרתי 'אליאס' בbashrc

function lspwd() {
find "$PWD" -maxdepth 1 -exec ls --color -d {} \;
}
לינוקס וקבצים lsof

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

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

לדוגמה אנו רוצים לקבל מידע על כל תהליך שרץ במערכת

$ lsof 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,1 4096 2 /
systemd 1 root rtd DIR 8,1 4096 2 /
systemd 1 root txt REG 8,1 1698400 1842178 /usr/lib/
...
...

הרבה מהמידע שמוצג נראה ג'בריש ולא ברור להלן הסבר קצר על שתי עמודות חשובות שישפוך קצת אור על הנושא
עמודת FD מציגה תיאור על הקובץ המדובר (קיצור של File Descriptor)

cwd:  current working directory
err: FD information error
ltx: shared library text (code and data)
Mxx: hex memory-mapped type number xx.
m86: DOS Merge mapped file
mem: memory-mapped file
mmap: memory-mapped device
pd: parent directory
rtd: root directory
txt: program text (code and data)
v86: VP/ix mapped file

לעמודה הזאת יש עוד סוג של מידע שנראה ממש מוזר
99r
104w
113u

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

r: read 
w: write
u: read & write

עמודת TYPE מציגה את סוג הקובץ עליו אנו מסתכלים, הסוגים הנפוצים

DIR = תיקייה
REG = קובץ רגיל
CHR = קובץ בעל תווים מיוחדים
FIFO = קובץ pipe

אז מה בעצם אפשר לעשות עם פקודת lsof?

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

$ lsof -p 1
OMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dumb-init 1 root cwd DIR 0,54 4096 9964742 /
dumb-init 1 root rtd DIR 0,54 4096 9964742 /
dumb-init 1 root txt REG 0,54 54744 9
309915 /u...
dumb-init 1 root mem REG 8,1 9309915 /usr/bin/...
...


פקודה
שימוש בדגל c יאפשר לקבל רק מידע שקשור לפקודה לסויימת

$ lsof -c firefox

תקשורת
שימוש בדגל i יאפשר לראות קבצים ותהליכים פונים לרשת

$ lsof -i        
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
kdeconnec 2292 user 11u IPv6 49368 0t0 UDP *:1716
kdeconnec 2292 user 12u IPv6 49369 0t0 TCP *:1716 (LISTEN)



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

כל התהליכים שמשתמשים בפרוטוקול מסויים ועוברים דרך פורט 80
דרך טווח של פורטים (300-1000)
דומיין מסויים (@whatsapp.com)
וכמובן ניתן ליצור קומבינציות משולבות של פילטרים

$ lsof -i TCP:80 
$ lsof -i UDP:3000-10000
$ lsof -i @whatsapp.com

תאחזר את כל הקבצים אליהם ניגש משתמש מסויים (-u)
כל המשתמשים האחרים חוץ ממשתמש מסויים (^)
אלו קבצים בתיקייה הנוכחית פתוחים על ידי איזה תהליך (+D)

$ lsof -u user
$ lsof -u ^root
$ lsof +D Project/test/

לסיכום זאת רק טעימה, יש עוד הרבה אפשרויות שהכלי מספק
כדאי לעבור על הman שלו ולראות עוד אלו הפתעות יש לו בשרוול

@learnlinuxnote
אתר אנטרקטיבי חביב ללימוד באש.
האתר תומך במגוון שפות בניהם גם עברית
רמת קושי: #beginners

Learn the ways of Linux-fu

https://linuxjourney.com/

#tools

@bash_tips
Bash Tips
Photo
באשיזם? shellcheck
רמת קושי: #advanced

באשיזם שמעתי מישהו קורא לזה, זאת בערך המקבילה של באש לפייתוניק קוד, הרעיון הוא לכתוב קוד קריא ויפה שעובד עם השפה. בהקשר הזה כדאי להכיר לינטר לshell (באש זיש דש וכו') המוכר בעולם בשם shellcheck.

מדובר על כלי שיציג הערות על הקוד לפני שאנו פוגשים אותם בטרמינל כשגיאות, shellcheck יחסית מוכר ויש לו פלאגינים כמעט לכל IDE / Editor שקיים (בתמונה), במידה ומשתמשים בIDE תוכלו לראות את השגיאות כבר בעורך, מי שמתעקש להריץ בדיקות מהטרמינל (CI?) זה נראה כך

$ shellcheck deploy.sh

In deploy.sh line 3:
eval $(aws ecr get-login --region ap-southeast-2 --no-include-email)
^-- SC2046: Quote this to prevent word splitting.

For more information:
https://www.shellcheck.net/wiki/SC2046 -- Quote this to prevent word splitt...

במידה ואנו רוצים להחריג התנהגות מסוימת במקום ספציפי בקוד אף על פי שהיא אינה קבילה מבחינת shellcheck, ניתן להוסיף הערת disable עם מספר השגיאה מעל השורה הבעייתית

# shellcheck disable=SC2046
eval $(aws ecr get-login --region ap-southeast-2 --no-include-email)

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

$ shellcheck -e SC2046 deploy.sh

#shellcheck

@bash_tips
לפתוח במקום goto
רמת קושי: #beginners

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

$ nano +198 myscript.sh

$ vi +198 myscript.sh

#editor

@bash_tips