مقدمة للمستخدم إلى غلاف Bash
باش (اعتبارًا من اليوم)ال de facto shell on most systems you’ll get in touch with: Linux, macOS, and the WSL on Windows 10.
تحديث: يستخدم macOS منذ Catalina (خريف 2019) Zsh
هناك أسباب تاريخية جعلت من Bash أشهر صدفة في العالم. مرة أخرى في عام 1989 ، عندما تم إصداره لأول مرة ، كان عالم التكنولوجيا مختلفًا تمامًا. في ذلك الوقت ، كانت معظم البرامج في عالم UNIX مغلقة المصدر. يونكس نفسها كانت ملكية ومصدر مغلق.
لاستخدام نظام UNIX ، كان عليك استخدام shell.
كانت الصدفة الأكثر شيوعًا في ذلك الوقت هي المصدر المغلق والملكية ، وكان عليك الدفع مقابل استخدامها. كانت قذيفة بورن المتاحة تحت/bin/sh
يأمر. أطلق عليه اسم "بورن" لأن منشئه هو ستيف بورن.
ريتشارد ستالمان في تلك السنوات مع مشروع جنو (ولاحقًا على لينكس) كان على وشك إحداث ثورة في كل شيء ، بادئًا ثورة المصادر المفتوحة. احتاج مشروع جنو إلى غلاف ، وولد باش بمساعدة مؤسسة البرمجيات الحرة. Bash مستوحاة بشدة من Bourne Shellبورن قذيفة ثانيةوهو أحد المكونات الرئيسية لمشروع جنو ، وربما أحد أكثر برمجياته نجاحًا التي ما زلنا نستخدمها حتى اليوم.
يمكن لـ Bash تشغيل جميع النصوص المكتوبة لـsh
، والتي كانت ميزة إلزامية لاعتمادها ، كما أنها قدمت العديد من الميزات الأخرى ، منذ الأيام الأولى للغاية ، مما يوفر تجربة أفضل لمستخدميها. منذ تلك الأيام الأولى ، اكتسب Bash الكثير من التحسينات. يصف هذا البرنامج التعليمي أكثر الأشياء شيوعًا وإفادة التي يمكنك فعلها بها.
الخطوات الأولى في باش
نظرًا لأن Bash هي الصدفة الافتراضية في العديد من الأنظمة ، فكل ما تحتاجه لبدء bash shell هو
- تسجيل الدخول إلى النظام ، إذا كان خادمًا
- افتح المحطة الطرفية ، إذا كان جهاز الكمبيوتر الخاص بك
انظر بلديدليل المحطة الطرفية macOSلمزيد من المعلومات حول استخدام جهازك الطرفي على جهاز Mac.
بمجرد بدء تشغيله ، يجب أن ترى موجهًا (والذي ينتهي عادةً بـ$
).
كيف تعرف أن الصدف يركض باش؟ جرب الكتابةhelp
والضغط على دخول.
نرى؟ لقد طلبنا للتو من Bash تنفيذhelp
يأمر. يوضح لك هذا الأمر بدوره إصدار Bash الذي تقوم بتشغيله وقائمة بالأوامر التي يمكنك استخدامها.
تحذير: هل ترى الإصدار الموجود لدي؟ 3.2.57. هذا هو إصدار Bash الافتراضي الذي يتم شحنه في macOS ، والذي لا يتضمن إصدارًا أعلى لمشكلات الترخيص. إصدار Bash هذا من عام 2014. قم بتثبيت أحدث إصدار من Bash 5.x باستخدام Homebrew ، عن طريق الكتابة
brew install bash
.
في كثير من الأحيان ، لن تستخدم أبدًا أيًا من الأوامر المدرجة في تعليمات bash ، إلا إذا كنت تقوم بإنشاءنصوص شلأو أشياء متقدمة.
99٪ من الاستخدام اليومي للقذيفة هو التنقل عبر المجلدات وتنفيذ برامج مثلls
وcd
وغيرها من المرافق العامة UNIX.
التنقل في نظام الملفات
للتنقل عبر نظام الملفات ، ستستخدم ملحقls
يأمر. إنه متاح في/bin/ls
، وبما أن Bash لديه/bin
مجلد في قائمة مساراته ، يمكنك فقط الكتابةls
لتستخدمها.
ls
يسرد الملفات الموجودة في المجلد الحالي. عادة ما تبدأ من المجلد الرئيسي الخاص بك ، والذي يعتمد على النظام ولكن على macOS تحت/Users
. مجلد منزلي موجود فيه/Users/flavio
. هذا ليس متعلقًا بـ Bash ، إنه أكثر من نظام ملفات UNIX ، لكن الحجج تتداخل وإذا لم تستخدم shell مطلقًا فمن الجيد معرفة ذلك.
للتنقل إلى المجلدات الأخرى التي تستخدم ملفcd
، متبوعًا باسم المجلد الذي تريد الانتقال إليه:
cd Documents
cd ..
يعود إلى المجلد الأصل.
بناءً على تكوين Bash الخاص بك ، سترى مجلدك الحالي معروضًا قبل المطالبة (ملف$
رمز). أو ربما لا يمكنك ذلك ، ولكن يمكنك دائمًا معرفة مكانك عن طريق الكتابةpwd
والضغط على دخول.
pwd
يعني * p * اسم الدليل * w * orking * d *
تحرير سطر الأوامر
عندما تكتب أوامرك في الغلاف ، لاحظ أنه يمكنك التحرك يسارًا ويمينًا باستخدام مفاتيح الأسهم. هذه ميزة قذيفة. يمكنك التنقل بين أوامرك ، والضغط على زر مسافة للخلف وتصحيح الأوامر. الضغط علىenter
يخبر المفتاح shell بالذهاب والسماح للنظام بتنفيذ الأمر.
يعد هذا سلوكًا طبيعيًا ومقبولًا ، ولكنه ربما جعل مستخدمي UNIX الأوائل "يذهلون".
تتيح لك مجموعات لوحة المفاتيح أن تكون سريعًا في التحرير دون الوصول إلى مفاتيح الأسهم:
ctrl+d
لحذف الحرف المحدد حاليًاctrl+f
للذهاب إلى الشخصية على اليمينctrl+b
للذهاب إلى الشخصية الموجودة على اليسار
تكملة أوتوماتيكية
ميزة رائعة لـ Bash عند التنقل في نظام الملفات هي الإكمال التلقائي. جرب الكتابةcd Doc
واضغط علىtab
مفتاح لجعل Bash يكمل ذلك تلقائيًاcd Documents
. إذا كانت هناك خيارات متعددة لتلك الأحرف الأولى ، فسيعيد لك Bash القائمة ، لذا يمكنك كتابة بضعة أحرف إضافية للمساعدة في إزالة الغموض والضغط علىtab
مرة أخرى للإكمال.
يمكن لـ shell إكمال أسماء الملفات تلقائيًا ، ولكن أيضًا أسماء الأوامر.
أوامر شل
باستخدام shell ، يمكننا تشغيل الأوامر المتوفرة على النظام. يمكننا أن نبدأ الأوامر بالمسار الكامل (على سبيل المثال/bin/ls
لسرد الملفات في مجلد) ولكن الغلاف له مفهومطريقحتى نتمكن من الكتابة فقطls
وهو يعرف مكان وجود معظم الأوامر (ويمكننا إضافة مجلدات إلى هذا المسار من خلال تكوينه).
الأوامر تقبل الحجج. على سبيل المثالls /bin
سوف يسرد جميع الملفات الموجودة في/bin
مجلد.
المعلمات مسبوقة بشرطة-
، مثلls -a
الذي يقولls
لإظهار الملفات المخفية أيضًا. الملفات المخفية كاتفاقية هي ملفات (ومجلدات) تبدأ بنقطة (.
).
أوامر shell الشائعة
هناك الكثير من الأوامر المثبتة مسبقًا على أي نظام ، وهي تختلف اختلافًا كبيرًا اعتمادًا على ما إذا كان Linux / macOS أو حتى توزيع Linux الذي تقوم بتشغيله.
ومع ذلك ، دعونا نجري تقريرًا موجزًا عن أوامر shell الأكثر شيوعًا التي يمكنك تشغيلها. لا يتم توفير هذه بواسطة القذائف في حد ذاتها ، ولكنها أوامر سطر أوامر يمكنك استدعاءها من خلال القذائف.
في أي وقت تواجه فيه مشكلات ، مثل عدم معرفتك بما يفعله الأمر ، أو لا تعرف كيفية استخدامه ، استخدمهman
. يتيح لك الحصول على المساعدة لجميع الأوامر التي سأدرجها ، والمزيد. يركضman ls
على سبيل المثال.
هذه هي أوامر نظام الملفات:
ls
لسرد الملفاتcd
لتغيير المجلدrm
لإزالة ملف أو مجلدmv
لنقل ملف إلى مجلد آخر ، أو تغيير اسم الملفcp
لنسخ ملفpwd
لإظهار دليل العمل الحاليmkdir
لإنشاء مجلد
كل ملف في نظام ملفات Unix له أذونات.chmod
يسمح لك بتغيير هؤلاء (عدم الدخول فيه الآن) ، وchown
يسمح لك بتغيير الملفصاحب.
cat
وtail
وgrep
هما أمران مفيدان للغاية للعمل مع الملفات.
pico
وnano
وvim
وemacs
هي برامج تحرير مثبتة بشكل شائع.
whereis
في macOS يظهر مكان وجود الأمر على النظام.
هناك العديد من الأوامر ، بالطبع ، ولكن هذه هي القليل من الأوامر التي قد تواجهها في كثير من الأحيان.
تنفيذ الأوامر
ls
وcd
هي أوامر ، كما ذكرت ، والتي توجد في/bin
مجلد. يمكنك تنفيذ أي ملف ، طالما أنه ملف قابل للتنفيذ ، عن طريق كتابة مساره الكامل ، على سبيل المثال/bin/pwd
. الأوامر لا تحتاج إلى أن تكون في/bin
المجلد ، ويمكنك تشغيل الملفات القابلة للتنفيذ الموجودة في مجلدك الحالي باستخدام ملف./
مؤشر المسار.
على سبيل المثال إذا كان لديك ملفrunme
ملف في الخاص بك/Users/flavio/scripts
مجلد ، يمكنك تشغيل
cd /Users/flavio/scripts
ثم ركض./runme
لتشغيله.
أو يمكنك الجري/Users/flavio/scripts/runme
من Bash ، أينما كان مجلدك الحالي.
وظائف
عندما تقوم بتشغيل أمر ما ، إذا كان برنامجًا يعمل لفترة طويلة ، فستكون صدفتك مملوكة بالكامل لهذا الأمر. يمكنك قتل الأمر باستخدامctrl-C
.
يمكنك الركض في أي وقتjobs
لمعرفة الوظائف التي تديرها ، وحالتهم.
$ jobs
Job Group State Command
1 72292 stopped ftpAnother useful command is ps
which lists the processes running.
$ ps
PID TTY TIME CMD
19808 ttys000 0:00.56 /usr/local/bin/fish -l
65183 ttys001 0:04.34 -fish
72292 ttys001 0:00.01 ftptop
shows the processes and the resources they are consuming on your system.
A job or process can be killed using kill <PID>
.
Command history
Pressing the up
arrow key will show you the history of the commands you entered. Again, this is a shell feature. Pressing the down
arrow key will let you navigate back and forth in time to see what commands you entered previously, and pressing enter
will let you run that command again.
This is a quick access to the command history. Running the history
command will show you all the commands entered in the shell:

When you start typing a command, Bash can autocomplete it by referencing a previously entered command in the history. Try it by pressing esc
followed by tab
.
To be honest I find the Fish shell implementation of this to be much better and easier
Setting your default shell
There are many more shells other than Bash. You have Fish, ZSH, TCSH, and others. Any user on the system can choose its own shell.
You set your default login shell by running the chsh -s
chsh -s /bin/bash
command. You’ll almost never need to do that, unless it was previously changed, for example with Fish:
chsh -s /usr/local/bin/fish
Customizing Bash
I noted before that you might (or might not) see your current working directory in the Bash prompt. Where is this determined? In the Bash configuration!
There’s a bit of confusion here because Bash uses a different configuration file for different scenarios, and it also reads multiple configuration files.
Let’s give some order to this confusion. First, there’s a big distinction whether Bash is initialized as a login shell or not. By login shell we mean that the system is not running a GUI (Graphical User Interface) and you log in to the system through the shell. That’s the case of servers, for example.
In this case, Bash loads this configuration file:
/etc/profileand then looks in the user home folder and looks for one of these files, in order, executing the first one it finds:
~/.bash_profile
~/.bash_login
~/.profilewere ~
means your home folder (it’s automatically translated by Bash)
This means that if there’s a .bash_profile
, ~/.bash_login
and ~/.profile
are never run, unless explicitly executed in .bash_profile
.
If instead of being a login shell Bash is run like I do with macOS, for example, as a normal application, the configuration files change. Bash loads first /etc/bash.bashrc
, then ~/.bashrc
.
Environment variables
Sometimes you have programs that use environment variables. Those are values that you can set outside of the program, and alter the execution of the program itself. An API key, for example. Or the name of a file.
You can set an environment variable using the syntax
VARIABLE_NAME=variable_value
The value can contain white spaces, by using quotes
VARIABLE_NAME="variable value"
A bash script can use this value by prepending a dollar sign: $VARIABLE_NAME
.
Also other programming languages commands can use environment variables, for example here’s how to read environment variables with Node.js.
The system sets up some environment variables for you, like
$HOME
your home folder
$LOGNAME
your user name
$SHELL
the path to your default shell
$PATH
the path where the shell looks for commands
You can inspect their value by prepending echo
to them:
echo $LOGNAME # flavio
echo $HOME # /Users/flavio
A special environment variable: $PATH
I mentioned the $PATH variable. This is a list of folders where the shell will look into when you type a command. Folders are separated by a colon :
and they are written in order - Bash will look into the first, search for the command you asked for, and run it if it finds it. Otherwise if goes to the next folder and so on.
My path is currently:
bash-5.0$ echo $PATH
/usr/local/bin:/usr/bin: /bin:/usr/sbin: /sbin:/usr/local/go/binYou typically edit this in the ~/.bashrc
file by prepending or appending items:
PATH = "$PATH:/Users/flavio/bin"
Aliases
Using aliases we can set up shortcuts for common commands. You can give a quick name to a complex combination of parameters, for example.
You define an alias using the syntax
alias <alias>=<command>
if there’s a space in the command you use quotes:
alias <alias>="<command>"
One alias I commonly add to my system is ll
:
alias ll="ls --al"
You normally define aliases in your ~/.bashrc
file.
Just be careful with quotes if you have variables in the command: using double quotes the variable is resolved at definition time, using single quotes it’s resolved at invokation time. Those 2 are different:
alias lsthis="ls $PWD"
alias lscurrent='ls $PWD'
$PWD refers to the current folder the shell is into. If you now navigate away to a new folder, lscurrent
lists the files in the new folder, lsthis
still lists the files in the folder you were when you defined the alias.
Advanced command line features
Wildcards
ls
and many other commands can make great use of wildcards. You can list all files starting with image:
ls image*
Or all files ending with image:
ls *image
or all files that contain image inside the name:
ls *image*
Redirecting output and standard error error
By default, commands started in the shell print out both the output and errors back to the shell. This might not be what you want. You can decide to write the output to a file instead.
Actually, to a /different file/, because in Unix even the screen is considered to be a file. In particular,
0
identifies the standard input
1
identifies the standard output
2
identifies the standard error
You can redirect the standard output to a file by appending 1>
after a command, followed by a file name.
Using the same technique you can use 2>
to redirect the standard error.
There is a shortcut >
for 1>
, since that is used quite a lot.
Example:
ls 1> list.txt 2> error.txt
ls > list.txt 2> error.txt
Another shortcut, &>
, redirects /both/ standard output and standard error to a file.
ls &> output.txt
Another frequent thing is to redirect standard error to standard output using 2>&1
.
Running a command in the background
You can tell Bash to run a program in the background without it taking control of the shell, by appending &
after it:
top &
top
is a command that lists the processes running, ordered by most resource consuming.
The application that would normally get control of the shell, is now started but nothing seems to happen. You can bring it back into focus by typing fg
(aka *f*ore*g*round), but now we’re entering in the realm of processes and jobs which is a big topic on its own, but a quick overview:
When a command is running you can use ctrl-Z
to pause it and bring it to the background. The shell comes back again in the foreground, and you can now run bg
to move resume execution of that previously paused job.
When you are ready to go back to it, run fg
to bring back that program in the foreground.
You can see all processes running using ps
, and the list shows all the processes pid
numbers. Using the paused process pid
, you can bring to foreground a specific command, for example fg 72292
. Same works for bg
.
Queuing commands
You can instruct Bash to run a command right after another ends by separating them with a semicolon:
cd /bin; ls
You can repeat this to queue multiple commands in the same line.
Output redirection
A program can receive input from any file using the <
operator, and save to a file the output using the >
operator:
echo hello > result.txt
wc < result.txt
wc
is a command that counts the words it receives as input.
Pipe
Using pipes, any command output can be used as input for a second command. Use the |
operator to combine the two. In this example, wc
gets its input from the output of echo hello
:
echo hello | wc
Grouping commands
Use &&
to combine two commands using “and”. If the first command executes without problems, run the second, and so on.
Use ||
to combine two commands using “or”. If the first command executes without problems the second does not run.
!
negates the next logical operation:
$ echo hello && echo test
hello
test
$ echo hello || echo test
hello
$ ! echo hello || echo test
hello
test
You can use parentheses to combine expressions to avoid confusion, and also to change the precedence:
$ ! (echo hello) || (echo test)
hello
test
$ ! (echo hello || echo test)
hello
Programming shells
One of the best features of a shell like Bash is its ability to create programs with it, by basically automating commands execution.
I’m going to write a separate guide on Bash scripting soon, which will be separate from this tutorial because the topic is really more in-depth than what I want to add in this introductory Bash guide.
A quick intro though: a script is a text file that starts with a line that indicates that it’s a shell script (and what shell it requires), followed by a list of commands, one per line. Example:
#!/bin/bash
ls
You can save this as a file myscript
and make it executable using chmod +x myscript
, and run it using ./myscript
(./
means “current folder”).
Shell scripting is outside of the scope of this post, but I want you to know about this. Scripts can have control structures and many other cool things.
This same scripting strategy works for other shells, like Zsh:
#!/bin/zsh
ls
Download my free Linux Commands Handbook
More cli tutorials:
- The Bash shell
- Introduction to Bash Shell Scripting
- The Fish Shell
- Shell, watch file content as it populates
- How to exit Vim
- UNIX Editors
- The UNIX Filesystem Commands
- Unix Shells Tutorial
- How to set an alias in a macOS or Linux shell
- A practical guide to Homebrew
- How to fix the xcrun invalid active developer path error in macOS
- The Command Line for Complete Beginners
- Introduction to Linux
- How to find the process that is using a port
- Linux commands: mkdir
- Linux commands: cd
- Linux commands: pwd
- Linux commands: rmdir
- Linux commands: ls
- Linux commands: mv
- Linux commands: cp
- Linux commands: less
- Linux commands: tail
- Linux commands: touch
- Linux commands: cat
- Linux commands: find
- Linux commands: ln
- Linux commands: ps
- Linux commands: echo
- Linux commands: top
- Linux commands: kill
- Linux commands: killall
- Linux commands: alias
- Linux commands: jobs
- Linux commands: bg
- Linux commands: fg
- Linux commands: type
- Linux commands: which
- Linux commands: whoami
- Linux commands: who
- Linux commands: clear
- Linux commands: su
- Linux commands: sudo
- Linux commands: chown
- Linux commands: chmod
- Linux commands: passwd
- Linux commands: open
- Linux commands: wc
- Linux commands: history
- Linux commands: du
- Linux commands: umask
- Linux commands: grep
- Linux commands: man
- Linux commands: uname
- Linux commands: sort
- Linux commands: uniq
- Linux commands: diff
- Linux commands: nohup
- Linux commands: df
- Linux commands: xargs
- Linux commands: gzip
- Linux commands: gunzip
- Linux commands: ping
- Linux commands: traceroute
- Linux commands: tar
- Linux commands: export
- Linux commands: crontab
- Linux commands: dirname
- Linux commands: basename
- Linux commands: printenv
- Linux commands: env
- A short guide to the ed editor
- A short guide to vim
- A short guide to emacs
- A short guide to nano
- Linux, no space left on device
- How to use Netcat