באיזה SHELL להשתמש? אתם מוזמנים לבדוק בגוגל, או לעיין בתשובה לשאלה הזאת ב Stack-Overflow". ובכן, קיימות תוכניות SHELL רבות. במעבדה הזאת ובמשך כל הקורס נעבוד עם bash. גם לינוקס / ubuntu פותח טרמינל ומריץ בו את bash (ברירת מחדל).
"שם המשחק" בעבודה עם טרמינל הוא יעילות. המטרה שלנו (במעבדה הזאת ובמעבדות הבאות) היא ללמוד לעבוד עם bash בצורה יעילה. בדרך כלל, לוקח זמן מה עד שלומדים לעבוד עם SHELL כלשהו, אבל כעבור כמה זמן, ככל שמכירים את האפשרויות שהוא נותן, ניתן להיות מאוד יעילים בעבודה עם ה- SHELL .
המטרה במעבדה הזאת היא להכיר את הפקודות הבסיסיות והנחוצות ביותר בעבודה עם bash, וכן להכיר מושגים ועקרונות בעבודה עם bash. ידע זה יאפשר לכם להיות יעילים בעבודה עם bash בהמשך הקורס וכן במקומות עבודה שתגיעו אליהם בעתיד.
כאמור, bash הוא רק אחד מני רבים - למשל, בסביבת לינוקס קיימים tcsh, ksh, dash, וכו'. ברגע שאתם מכירים היטב shell מסוים, העקרונות שלמדתם וסיגלתם לעצמכם ישימים גם ל SHELLS אחרים. רוב ה SHELLS מספקים קבוצה של אפשרויות (יכולות) דומות. הם נבדלים ביניהם ראשית בתחביר וביכולות נוספות שחלקם מציעים.
כעת אתם אמור לקבל חלון - טרמינל של bash שבו אנחנו יכולים להקליד פקודות שונות, והפלט שלהן יוצג (בד"כ) על המסך.
חלון CYGWIN שפתחתי אצלי במחשב נראה בערך כך:
החלון שפתחתי בלינוקס (במחשב שלי) נראה כך:
Type in the following commands:
Run the following commands which I use for my prompt:
PS1="\[\e]0;\w\a\]\n\e[7m\[\e[32m\]\u\@\[\e[33m\] \w\[\e[34m\]\n\\[\e[0m\]$==> "
אני "אוהב" את ה- prompt הזה. האם אני צריך להקליד את הפקודה הנ"ל בכל פעם שאני מריץ מחדש טרמינל של BASH ?
echo $PS1
echo $HOME echo $USER echo $PATH
כמובן, ישנם עוד הרבה מאוד משתנים (לעתים מכונים משתני-סביבה.. ויש הבדל מסוים בין "סתם משתנים" לבין "משתני סביבה" לא ניכנס כאן להבדלים האלו). בפרט בסביבה של CYGWIN - הוא מקבל "בירושה" את כל המשתנים שמוגדרים ב- Windows. אין צורך להכיר את כל המשתנים. הפקודה הבאה printenv מציגה את כל המשתנים למסך.
printenv
run the following commands:
שימו לב, הסולמית משמשת כהערה - ה bash מתעלם מכל מה שמופיע אחריה. אין צורך להקליד את הפקודות הבאות - ניתן לעשות העתק-הדבק לכל הקטע הזה (לכל 6 הפקודות הבאות, כולל ההערה), ולהדביק אותן בחלון cygwin/bash
pwd # print the working directory mkdir dir1 # create a directory dir1 cd dir1 # change the working directory pwd cd .. # change dir to the parent directory pwd
cd dir1 mkdir dir2 cd dir2 pwd echo $HOME cd $HOME pwd cd dir1/dir2 pwd cd ~ # tilde (the symbol ~ is another name to the $HOME echo ~
cd # same as cd ~ i.e. cd w/o arguement changes to home dir ls ls -l
ls -aAnd also Run the commands:
ls -la # same as ls -l -a : you can combine the flags
At the same time, we usually don't want to "see" these configuration files.
Solution: Read configuration file, which we call - "RC" files (or "dot RC files") when they start up.
Let's examine the .bashrc file in your home directory
cd ~
less .bashrc
cat .bashrc
vi .bashrc
gedit .bashrc &
One file can source ("include") another file.
Indeed, the setting I'm using, which is also installed in the lab, the .bashrc file is 'sourcing' another file, called '.aliasrc'. This file has many command shortcuts. For example, there's a very useful command called 'grep --color'. Instead of typing that, there's a shortcut definition, and we can type only 'g' instead.
Copy the files .bashrc and .aliasrc and put them in your home directory.
It is a good
and common practice to save (keep) the old file, in case something goes
wrong with the new file, and we want to undo the change.
tar -xvf bashrc.tar cd bashrc_dir ls -la # you can see the files in this temp directory mv ~/.bashrc ~/.bashrc_sav # saving cp .bashrc .aliasrc ~ # copying these two file to home dir (~ is home dir) cd # change dir to your home source .bashrc
mv .bashrc .bashrc-sav ls -a# move the downloaded files .bashrc and .aliasrc to your home directory. You can do it from the file-explorer on windows.
To check that these files are now in your home directory, run the command:
ls -lda .*Note: some unix tools allow us to combine flags. we don't need to type: ls -l -d -a ..... instead: ls -lda
What is the flag -d
doing? --> try the same command without this flag.
You should get output similar to this one:
Open a new windows, and check that things work properly,
e.g. you get the prompt, and you see the
aliases
Type the command: alias. If the above steps worked properly, you should see many aliases printed on the screen
cntl + a cntl + e backspace cntl + d cntl + c
מי שעובד בזה הרבה, (או כשיעבוד) כדאי לו להשקיע בלימוד הזה – ההשקעה מחזירה את עצמה במהירות!
date echo aaa echo bbb history 5 !-2 !-4 !d
הריצו את הפקודות הבאות (אחת אחרי השניה):
mkdir temp_with-long-name # create temp folder cd temp<TAB> # change dir ls touch file1 ls f<TAB> touch file22222 ls f<TAB><TAB>2<TAB> cd .. rmdir tem<TAB> # cannot remove, cause it's not empty rm tem<TAB>/* rmdir (use up arrow twice)
הריצו את הפקודות הבאות (אחת אחרי השניה):
mkdir temp ; cd temp ; pwd touch blah; ls -lt !-2 # run again the command line !! # run again the last command line
הריצו את הפקודות הבאות, והבינו מה מתרחש:
pwd # show the present work dir ls cd .. # cd to parent pwd ls home ls /home ls / cd / ls home echo ~ ls ~ mkdir ~/temp cd ~/temp touch blah cd / echo $USER ls home/$USER/temp rm ~/temp/blah #rm command to remove a file rmdir ~/temp #rmdir - command to remove directory echo $HOME cd $HOME
which <command-name>
./print_hello
/hom/tzvi/bin/print_hello
// hello.c int main () { puts("hello student!!\n"); return 0; }Run the following commands:
gcc hello.c # default name for the compiled object is a.out ls –l a ./a which a which ./a which gcc # we run gcc again, this time give it a specific name for the program it creates gcc hello.c –o print_hello ls –l ./print_hello
הריצו את הפקודות הבאות, שבוחנות את ערכו של PATH$ ומשנות אותו
# Examine the current value of $PATH echo $PATH # to see the PATH in a clearer way: echo $PATH | sed s/:/\\n/g # (just introduced you to some advanced magic... using pipes and the sed command) # switch to your home dir... you probably cannot run the print_hello program: cd # cd with no param takes you home print_hello # modify the $PATH PATH=$PATH:~/labs/hello print_hello
רשימת פקודות Bash/Linux לרשימת הנושאים
alias, unalias | create or destroy an alias (shortcut for command) |
bash, exit | start a bash sell, exit the shell |
bg, fg, jobs | display the jobs which are currently running, send a job to run in the background or the foreground. |
cat, head, tail, less, more | print a file to the screen (actually to std out). Head - just the head of it (first few lines), tail - just the tail (last few lines). less or more invoke a PAGER which display one screen of the file each time |
mkcd, cd | create a directory, change CWD |
clear | clears the terminal screen |
cp, ln | copy a file, create link (soft or hard) to a file or directory |
chmod | change the permissions of a file or directory |
date | display or set the current time or date |
diff, sdiff | compare two files |
du, df | report disk space usage - df: of the disk, du: of a file or directory |
pushd, popd, dirs | push or pop CWD to the stack, dirs - display the stack of directories |
echo | display/print text to std out |
find | find a file |
gcc, g++, ld | compile a file (gcc - C compiler, g++ - C++ compiler. ld - loader |
grep | display lines of a file which match a given pattern or text |
ls | list files, i.e. show the files in the specified directory |
history | display the recent commands (saved in the 'history' of the shell) |
make | invoke the make program, which act according to a Makefile. typically used to build/compile applications |
man, apropos | man displays the man page of a command or function or system call, etc. Apropos searches the DB of man pages, and displays command which might be relevant to the pattern (argument) |
mv, rename | mv - ranames a file or directory, rename - change the names of many files based on some pattern (פקודה מגניבה) |
rm, rmdir | rm - removes a file, rmdir - removes a directory |
printenv | display the values of variables |
pwd | print current working directory |
ps, kill | prints information about a process. kill - kills a process or sends a signal to a process |
source | execute a file (script) in the **current** shell. A little bit like include |
awk, sed | string substitution and manipulation |
time | display summary of the time it took to run a command (run: time <some-command> |
sleep | go to sleep for some time |
su, sudo | su (set user) - Run shell, Change the effective user
(user id and group id).
sudo - execute a command as another user. These commands are often needed/useful when we need to run something as root. |
touch | change the timestamp of a file. If the file does not exist, create a zero length file |
uname | print system information, like type and version of OS (try: uname -a) |
tar, gzip, gunzip, zcat | compress or expand files. |
top | display load data and the processes which consume pick resources |
wget | get/download file(s) and possibly directories from URL |
which | print the path of a command |
who | print the session and users on this machine (not working well on windows) |
whoami | print the name of current user |
wc | 'word count' - counts the lines, words and characters of a file (or output stream) |
hexdump | useful do display the content of binary (non-ascii) files |