الفرق بين المراجعتين لصفحة: «Bash/variables»

من موسوعة حسوب
إضافة 2.0: إدخال أولي
إضافة: إدخال 2.1
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:المتغيرات في Bash}}</noinclude>
<noinclude>{{DISPLAYTITLE:المتغيرات في Bash}}</noinclude>
أنواع المتغيرات
أنواع المتغيرات


سطر 122: سطر 123:
UID=504
UID=504
</syntaxhighlight>للمزيد عن لغة Awk البرمجية المُستخدمة في المثال السابق، انظر صفحتها على [https://ar.wikipedia.org/wiki/%D8%A3%D9%88%D9%83 ويكيبيديا].
</syntaxhighlight>للمزيد عن لغة Awk البرمجية المُستخدمة في المثال السابق، انظر صفحتها على [https://ar.wikipedia.org/wiki/%D8%A3%D9%88%D9%83 ويكيبيديا].
 
===تصنيف المتغيرات بناء على محتواها===
=== تصنيف المتغيرات بناء على محتواها ===
يمكن تصنيف المتغيرات وفقًا لنوع المحتوى الذي يحمله المتغير، وبناءً على ذلك فإن المتغيرات تنقسم إلى أربعة أنواع:
يمكن تصنيف المتغيرات وفقًا لنوع المحتوى الذي يحمله المتغير، وبناءً على ذلك فإن المتغيرات تنقسم إلى أربعة أنواع:


سطر 182: سطر 182:
ولكي تمرِّر المتغيرات إلى الصدفة الفرعية يجب أن نصدّرها باستخدام أمر export أولًا، ويشار إلى المتغيرات التي صُدِّرَت على أنها متغيراتُ بيئة، وتتم عمليتي الضبط والتصدير في خطوة واحدة:<syntaxhighlight lang="bash">
ولكي تمرِّر المتغيرات إلى الصدفة الفرعية يجب أن نصدّرها باستخدام أمر export أولًا، ويشار إلى المتغيرات التي صُدِّرَت على أنها متغيراتُ بيئة، وتتم عمليتي الضبط والتصدير في خطوة واحدة:<syntaxhighlight lang="bash">
export VARNAME="value"
export VARNAME="value"
</syntaxhighlight>ويمكن للصدفة الفرعية أن تعدّل على المتغيرات التي اكتسبتها من الصدفة الأم، لكن تلك التغييرات لن تؤثر في الصدفة الأم، إليك مثالًا يشرح الأمر:<syntaxhighlight lang="bash">
</syntaxhighlight>ويمكن للصدفة الفرعية أن تعدّل على المتغيرات التي اكتسبتها من الصدفة الأم، لكن تلك التغييرات لن تؤثر في الصدفة الأم، إليك مثالًا يشرح الأمر:<syntaxhighlight lang="bash" start="1">
hsoub ~> full_name="Hsoub Alaraby"
hsoub ~> full_name="Hsoub Alaraby"


سطر 199: سطر 199:
Hsoub Alaraby
Hsoub Alaraby


hsoub ~> export full_name="Charles the Great"
hsoub ~> export full_name="Osama H. Damarany"


hsoub ~> echo $full_name
hsoub ~> echo $full_name
Charles the Great
Osama H. Damarany


hsoub ~> exit
hsoub ~> exit
سطر 210: سطر 210:


hsoub ~>
hsoub ~>
</syntaxhighlight><span> </span>
</syntaxhighlight><span>في المثال أعلاه، لدينا المتغير full_name له قيمة هي Hsoub Alaraby،  وحين نحاول قراءة تلك القيمة في صدفة فرعية فإننا نحصل على إجابة فارغة (يظهر أمر echo قيمة فارغة -null string-).</span>
 
نخرج الآن من الصدفة الفرعية ونصدّر متغير full_name ونحن في الصدفة الأم، ثم نفتح صدفة فرعية جديدة ونطلب قيمة المتغير full_name مرة أخرى، فنحصل هذه المرة على قيمته (Hsoub Alaraby)، ذلك أن المتغير صار مرئيًا للصدفة الفرعية بعد تصديره.
 
نستطيع تغيير قيمة المتغير داخل الصدفة الفرعية كما ترى في المثال إلى (Osama H. Damarany)، لكن حين نخرج من تلك الصدفة ونعود إلى الصدفة الأم لنطلب قيمة المتغير نفسه، فإننا نحصل على القيمة الأولى (Hsoub Alaraby)، فلم تتأثر قيمته في الصدفة الأم بتغيرها داخل صدفة فرعية.
 
المتغيرات المحفوظة
 
المتغيرات المحفوظة في صدفة بورن
 
تستخدم Bash بعض المتغيرات بنفس الطريقة التي تستخدمها صدفة بورن بها، وتعطي bash في بعض الحالات قيمة افتراضية للمتغير، يعطي الجدول التالي نظرة عامة على تلك المتغيرات:
 
جدول 3.1 : المتغيرات المحفوظة في صدفة بورن
{| class="wikitable"
|'''اسم المتغير'''
|'''التعريف'''
|-
|CDPATH
|قائمة من المجلدات يفصل بين كل منها نقطتان ":" تُستخدم كمسار للبحث لأمر cd.
|-
|HOME
|مجلد المنزل للمستخدم الحالي، وهو المجلد الافتراضي لأمر cd. يستخدم تَوسُّع المَدّة (tilde expansion) قيمة هذا المتغير أيضًا.
|-
|IFS
|قائمة من المحارف التي تفصل بين الحقول، تُستخدم حين تفصل الصدفة الكلمات كجزء من عملية التوسع.
|-
|<code>MAIL</code>
|عند تعيين أحد الملفات كقيمة لهذا المعامل فإن bash تُشعر المستخدم بوصول بريد في ذلك الملف، بشرط ألا يُضبط متغير MAILPATH على أي قيمة.
|-
|<code>MAILPATH</code>
|قائمة بأسماء الملفات تفصل بينها نقطتان رأسيتان. تتفقد bash تلك القائمة دوريًا لترى إن كانت هناك رسائل بريدية جديدة.
|-
|<code>OPTARG</code>
|قيمة آخر وسيط خياري (option argument) عالجه أمر getopts.
|-
|<code>OPTIND</code>
|فهرس (index) لآخر وسيط خياري (option argument) عالجه أمر getopts.
|-
|<code>PATH</code>
|قائمة من المجلدات التي يفصل بين كل منها نقطتان رأسيتان ":" تبحث فيها bash عن الأوامر.
|-
|<code>PS1</code>
|النص الأساسي للمحث، وقيمته الافتراضية هي <code>"' $\s-\v\'"</code> .
|-
|<code>PS2</code>
|النص الثانوي للمحث، وقيمته الافتراضية هي <code>"" <""</code> .
|}
المتغيرات المحفوظة في صدفة Bash
 
تُضبط هذه المتغيرات أو تُستخدم من قِبل Bash، أما بقية الصدفات فلا تعاملها بشكل خاص عما سواها:
 
جدول 3.2 : المتغيرات المحفوظة في صدفة Bash<span> </span>
{| class="wikitable"
|اسم المتغير
|التعريف
|-
|auto_resume
|يتحكم هذا المتغير في كيفية تفاعل الصدفة مع المستخدم والتحكم في الوظائف (Job Control).
|-
|BASH
|الاسم الكامل للمسار المُستخدَم في تنفيذ النسخة الحالية من Bash
|-
|BASH_ENV
|إن ضُبط هذا المتغير عند استدعاء bash من أجل تنفيذ برنامج للصدفة (shell script) فإن قيمته تتوسع ويُستخدم كاسم لملف بدء تشغيل (startup file) يُقرأ قبل تنفيذ البرنامج.
|-
|BASH_VERSION
|رقم الإصدار للنسخة الحالية من Bash.
|-
|BASH_VERSINFO
|متغير مصفوفة للقراءة فقط، تحمل عناصره معلومات عن إصدارة النسخة الحالية من Bash.
|-
|COLUMNS
|يستخدم أمر select هذا المتغير لتحديد عرض الطرفية عند طباعة قوائم الاختيار، ويُضبط تلقائيًا عند تلقي إشارة SIGWINCH .
|-
|COMP_CWORD
|فهرس إلى {COMP_WORDS}$ من الكلمة التي تحتوي الموضع الحالي للمؤشر.
|-
|COMP_LINE
|سطر الأوامر الحالي.
|-
|COMP_POINT
|فهرس للموضع الحالي للمؤشر بالنسبة لبداية الأمر الحالي.
|-
|COMP_WORDS
|متغير مصفوفة يتكون من كلمات منفردة في سطر الأوامر الحالي.
|-
|COMPREPLY
|متغير مصفوفة تقرأ منه Bash الاحتمالات الممكنة للإكمال، والمولَّدة عبر دالة مستدعاة من قِبل أداة إكمال قابلة للبرمجة (programmable).
|-
|DIRSTACK
|متغير مصفوفة به المحتويات الحالية لمكدّس المجلدات.
|-
|EUID
|المعرّف الرقمي الفعّال للمستخدم الحالي.
|-
|FCEDIT
|المحرر المستخدم افتراضيًا من قِبل خيار e- لأمر fc.
|-
|FIGNORE
|قائمة لواحق (suffixes) يفصل بين كل منها نقطتان رأسيتان، يتم تجاهلها عند إكمال اسم ملف ما.
|-
|FUNCNAME
|اسم أي دالة للصدفة تُنفّذ حاليًا.
|-
|GLOBIGNORE
|قائمة من الأنماط التي تحدد مجموعة أسماء الملفات التي يتم تجاهلها من قِبل توسُّع اسم الملف (file name expansion).
|-
|GROUPS
|متغير مصفوفة يحتوي قائمة من المجموعات التي ينتمي إليها المستخدم الحالي.
|-
|histchars
|مجموعة محارف (بحد أقصى 3) تتحكم في توسع التأريخ، والاستبدال السريع والترميز (tokenization).
|-
|HISTCMD
|رقم التأريخ أو فهرس في قائمة التأريخ للأمر الحالي.
|-
|HISTCONTROL
|يحدد ما إن كان أمر ما قد أضيف إلى ملف التأريخ.
|-
|HISTFILE
|اسم الملف الذي يُحفظ فيه تأريخ الأوامر، تكون قيمته bash_history./~ افتراضيًا.
|-
|HISTFILESIZE
|أقصى عدد من الأسطر التي يمكن استيعابها في ملف تأريخ، يُضبط افتراضيًا على 500.
|-
|HISTIGNORE
|قائمة من الأنماط المستخدمة في تحديد أسطر الأوامر التي يجب أن تُحفظ في قائمة التأريخ.
|-
|HISTSIZE
|أقصى عدد من الأوامر التي يمكن حفظها في قائمة التأريخ، الحد الافتراضي هو 500.
|-
|HOSTFILE
|يحتوي اسم ملف بنفس صيغة etc/hosts/ الذي يجب أن يُقرأ عندما تحتاج الصدفة أن تكمل اسم المضيف (hostname).
|-
|HOSTNAME
|اسم المُضيف الحالي.
|-
|HOSTTYPE
|نص يصف الحاسوب/الآلة التي تعمل Bash عليها.
|-
|IGNOREEOF
|يتحكم هذا المتغير في الإجراء الذي تتخذه الصدفة عند استلام محرف EOF كمُدخَل وحيد.
|-
|INPUTRC
|اسم ملف تهيئة Readline، يحل هذا محل etc/inputrc/ الافتراضي.
|-
|LANG
|يُستخدم لتحديد التصنيف الموضعي لأي تصنيف لم يتم اختياره تحديدًا بمتغير يبدأ بـ _LC .
|-
|LC_ALL
|يلغي هذا المتغير قيمة LANG وأي متغير _LC آخر يحدد تصنيفًا موضعيًا.
|-
|LC_COLLATE
|يحدد هذا المتغير ترتيب المقارنة (collation order) المستخدم أثناء تصنيف نتائج توسعة اسم الملف (file name expansion)، ويحدد سلوك تعبيرات المدى (range expressions) وطبقات المعادلة (equivalence classes) وتسلسلات المقارنات (collating sequences) داخل توسعة اسم الملف، وكذلك ومطابقة الأنماط (pattern matching).
|-
|LC_CTYPE
|يحدد هذا المتغير تفسير المحارف وسلوك طبقات المحارف داخل توسعة اسم الملف ومطابقة الأنماط.
|-
|LC_MESSAGES
|This variable determines the locale used to translate double-quoted strings preceded by a "$" sign.
 
يحدد هذا المتغير الموضع المستخدم لترجمة النصوص التي بين علامتي تنصيص مزدوجة، والتي سُبقت بعلامة "$".
|-
|LC_NUMERIC
|يحدد هذا المتغير موضع التصنيف المستخدم لتهيئة الرقم (number formatting).
|-
|LINENO
|رقم السطر الذي يُنفَّذ الآن في برنامج الصدفة (shell script) أو دالة الصدفة.
|-
|LINES
|يستخدم هذا المتغير بواسطة أمر select لتحديد طول العمود لطباعة قوائم الاختيار.
|-
|MACHTYPE
|نص يصف نوع النظام الذي تنفذه Bash، بصيغة GNU CPU-COMPANY-SYSTEM.
|-
|MAILCHECK
|الزمن -بالثواني- الذي يمضي حتى تتفقد الصدفة البريد داخل الملفات المحددة في متغيرات MAIL و MAILPATH.
|-
|OLDPWD
|المجلد العامل السابق الذي حدده أمر cd.
|-
|OPTERR
|إن ضُبطت قيمة هذا المتغير على 1 فإن Bashتعرض رسائل خطأ مولّدة بواسطة أمر getopts.
|-
|OSTYPE
|نص يصف نظام التشغيل العاملة عليه Bash.
|-
|PIPESTATUS
|متغير مصفوفة يحتوي قائمة بها قِيَم حالات الخروج من العمليات التي في أنبوب الواجهة (foreground pipeline) الذي نُفِّذ حديثًا (قد يحتوي أمرًا واحدًا فقط).
|-
|POSIXLY_CORRECT
|If this variable is in the environment when bash starts, the shell enters POSIX mode.
|-
|PPID
|The process ID of the shell's parent process.
|-
|PROMPT_COMMAND
|If set, the value is interpreted as a command to execute before the printing of each primary prompt (PS1).
|-
|PS3
|The value of this variable is used as the prompt for the select command. Defaults to "'#? '"
|-
|PS4
|The value is the prompt printed before the command line is echoed when the -x option is set; defaults to "'+ '".
|-
|PWD
|The current working directory as set by the cd built-in command.
|-
|RANDOM
|Each time this parameter is referenced, a random integer between 0 and 32767 is generated. Assigning a value to this variable seeds the random number generator.
|-
|REPLY
|The default variable for the readbuilt-in.
|-
|SECONDS
|This variable expands to the number of seconds since the shell was started.
|-
|SHELLOPTS
|A colon-separated list of enabled shell options.
|-
|SHLVL
|Incremented by one each time a new instance of Bash is started.
|-
|TIMEFORMAT
|The value of this parameter is used as a format string specifying how the timing information for pipelines prefixed with the time reserved word should be displayed.
|-
|TMOUT
|If set to a value greater than zero, TMOUT is treated as the default timeout for the read built-in. In an interative shell, the value is interpreted as the number of seconds to wait for input after issuing the primary prompt when the shell is interactive. Bash terminates after that number of seconds if input does not arrive.
|-
|UID
|The numeric, real user ID of the current user.
|}

مراجعة 09:20، 5 أغسطس 2018


أنواع المتغيرات

تُكتب متغيرات الصدفة بحروف إنجليزية كبيرة، وتحتفظ Bash بقائمة من نوعين من المتغيرات:

المتغيرات العامة Global Variables

ستجد المتغيرات العامة أو متغيرات البيئة (environment variables) في جميع الصدفات، ويمكن استخدام أوامر env أو printenv لعرض متغيرات البيئة، وتأتي تلك البرامج في حزمة sh-utils. إليك مثالًا لخرج أمر printenv:

hsoub ~> printenv
CC=gcc
CDPATH=.:~:/usr/local:/usr:/
CFLAGS=-O2 -fomit-frame-pointer
COLORTERM=gnome-terminal
CXXFLAGS=-O2 -fomit-frame-pointer
DISPLAY=:0
DOMAIN=hq.garrels.be
e=
TOR=vi
FCEDIT=vi
FIGNORE=.o:~
G_BROKEN_FILENAMES=1
GDK_USE_XFT=1
GDMSESSION=Default
GNOME_DESKTOP_SESSION_ID=Default
GTK_RC_FILES=/etc/gtk/gtkrc:/nethome/hsoub/.gtkrc-1.2-gnome2
GWMCOLOR=darkgreen
GWMTERM=xterm
HISTFILESIZE=5000
history_control=ignoredups
HISTSIZE=2000
HOME=/nethome/hsoub
HOSTNAME=octarine.hq.garrels.be
INPUTRC=/etc/inputrc
IRCNAME=hsoub
JAVA_HOME=/usr/java/j2sdk1.4.0
LANG=en_US
LDFLAGS=-s
LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins
LESSCHARSET=latin1
LESS=-edfMQ
LESSOPEN=|/usr/bin/lesspipe.sh %s
LEX=flex
LOCAL_MACHINE=octarine
LOGNAME=hsoub
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
MACHINES=octarine
MAILCHECK=60
MAIL=/var/mail/hsoub
MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man
MEAN_MACHINES=octarine
MOZ_DIST_BIN=/usr/lib/mozilla
MOZILLA_FIVE_HOME=/usr/lib/mozilla
MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin
MTOOLS_FAT_COMPATIBILITY=1
MYMALLOC=0
NNTPPORT=119
NNTPSERVER=news
NPX_PLUGIN_PATH=/plugin/ns4plugin/:/usr/lib/netscape/plugins
OLDPWD=/nethome/hsoub
OS=Linux
PAGER=less
PATH=/nethome/hsoub/bin.Linux:/nethome/hsoub/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin:.
PS1=\[\033[1;44m\]hsoub is in \w\[\033[0m\]
PS2=More input>
PWD=/nethome/hsoub
SESSION_MANAGER=local/octarine.hq.garrels.be:/tmp/.ICE-unix/22106
SHELL=/bin/bash
SHELL_LOGIN=--login
SHLVL=2
SSH_AGENT_PID=22161
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_AUTH_SOCK=/tmp/ssh-XXmhQ4fC/agent.22106
START_WM=twm
TERM=xterm
TYPE=type
USERNAME=hsoub
USER=hsoub
_=/usr/bin/printenv
VISUAL=vi
WINDOWID=20971661
XAPPLRESDIR=/nethome/hsoub/app-defaults
XAUTHORITY=/nethome/hsoub/.Xauthority
XENVIRONMENT=/nethome/hsoub/.Xdefaults
XFILESEARCHPATH=/usr/X11R6/lib/X11/%L/%T/%N%C%S:/usr/X11R6/lib/X11/%l/%T/%N%C%S:/usr/X11R6/lib/X11/%T/%N%C%S:/usr/X11R6/lib/X11/%L/%T/%N%S:/usr/X11R6/lib/X11/%l/%T/%N%S:/usr/X11R6/lib/X11/%T/%N%S
XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB
XMODIFIERS=@im=none
XTERMID=
XWINHOME=/usr/X11R6
X=X11R6
YACC=bison -y

المتغيرات المحلية Local Variables

لن تجد المتغيرات المحلية إلا في الصدفة الحالية، ويمكن استخدام أمر set -بدون خيارات- لعرض قائمة بكل الدوال والمتغيرات -بما في ذلك متغيرات البيئة-، ويُصنَّف الخَرْج وفقًا للموضع الحالي ويُعرض كذلك في صيغة يمكن إعادة استخدامها.

وإليك مثالًا لملف diff أُنشئ من مقارنة خَرجيْ الأمرين printenv و set ، بعد استثناء الدوال التي يمكن عرضها باستخدام أمر set أيضًا:

hsoub ~> diff set.sorted printenv.sorted | grep "<" | awk '{ print $2 }'
BASE=/nethome/hsoub/.Shell/hq.garrels.be/octarine.aliases
BASH=/bin/bash
BASH_VERSINFO=([0]="2"
BASH_VERSION='2.05b.0(1)-release'
COLUMNS=80
DIRSTACK=()
DO_FORTUNE=
EUID=504
GROUPS=()
HERE=/home/hsoub
HISTFILE=/nethome/hsoub/.bash_history
HOSTTYPE=i686
IFS=$'
LINES=24
MACHTYPE=i686-pc-linux-gnu
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PIPESTATUS=([0]="0")
PPID=10099
PS4='+
PWD_REAL='pwd
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
THERE=/home/hsoub
UID=504

للمزيد عن لغة Awk البرمجية المُستخدمة في المثال السابق، انظر صفحتها على ويكيبيديا.

تصنيف المتغيرات بناء على محتواها

يمكن تصنيف المتغيرات وفقًا لنوع المحتوى الذي يحمله المتغير، وبناءً على ذلك فإن المتغيرات تنقسم إلى أربعة أنواع:

متغيرات نصية.

متغيرات عددية.

متغيرات ثابتة.

متغيرات المصفوفة.

ستجد مزيدًا من الشرح عن هذه الأنواع في المزيد عن المتغيرات في Bash، أما الآن فسنعمل مع قيم عددية ونصية للمتغيرات التي لدينا.

إنشاء المتغيرات

أسماء المتغيرات حساسة لحالة الأحرف، ويُكتب المتغير بأحرف إنجليزية كبيرة افتراضيًا لكن يمكن إعطاء المتغيرات المحلية أسماء بأحرف صغيرة، وفي كل الأحوال فإن لديك الحرية في استخدام الأسماء التي تريدها أو أن تضع حروفًا صغيرة وكبيرة داخل اسم متغير واحد.

كذلك فإن المتغيرات يمكن أن تحتوي أرقامًا بشرط ألا يبدأ اسم المتغير برقم:

prompt> export 1number=1
bash: export: `1number=1': not a valid identifier

استخدم الشيفرة التالية لضبط قيمة متغير في الصدفة:

VARNAME="value"

لكن انتبه، فلا تضع مسافات حول علامتي التنصيص إذ سيتسبب ذلك في أخطاء، لذا من الجيد أن تكتسب عادة اقتباس المحتوى النصي حين تعيّن قِيَمًا لمتغيرات، إذ سيقلل هذا احتمال وقوع الخطأ. إليك بعض الأمثلة على استخدام الأحرف بحالتيها والأرقام والمسافات:

hsoub ~> MYVAR1="2"

hsoub ~> echo $MYVAR1
2

hsoub ~> first_name="Hsoub"

hsoub ~> echo $first_name
Hsoub

hsoub ~> full_name="Hsoub Alaraby"

hsoub ~> echo $full_name
Hsoub Alaraby

hsoub ~> MYVAR-2="2"
bash: MYVAR-2=2: command not found

hsoub ~> MYVAR1 ="2"
bash: MYVAR1: command not found

hsoub ~> MYVAR1= "2"
bash: 2: command not found

hsoub ~> unset MYVAR1 first_name full_name

hsoub ~> echo $MYVAR1 $first_name $full_name
<--no output-->

hsoub ~>

تصدير المتغيّرات

المتغير الذي يُنشأ مثلما رأينا في المثال أعلاه لا يكون متاحًا إلا في الصدفة الحالية، فهو متغير محلّي، والعمليات الفرعية للصدفة الحالية لن تتعرف على هذا المتغير.

ولكي تمرِّر المتغيرات إلى الصدفة الفرعية يجب أن نصدّرها باستخدام أمر export أولًا، ويشار إلى المتغيرات التي صُدِّرَت على أنها متغيراتُ بيئة، وتتم عمليتي الضبط والتصدير في خطوة واحدة:

export VARNAME="value"

ويمكن للصدفة الفرعية أن تعدّل على المتغيرات التي اكتسبتها من الصدفة الأم، لكن تلك التغييرات لن تؤثر في الصدفة الأم، إليك مثالًا يشرح الأمر:

hsoub ~> full_name="Hsoub Alaraby"

hsoub ~> bash

hsoub ~> echo $full_name


hsoub ~> exit

hsoub ~> export full_name

hsoub ~> bash

hsoub ~> echo $full_name
Hsoub Alaraby

hsoub ~> export full_name="Osama H. Damarany"

hsoub ~> echo $full_name
Osama H. Damarany

hsoub ~> exit

hsoub ~> echo $full_name
Hsoub Alaraby

hsoub ~>

في المثال أعلاه، لدينا المتغير full_name له قيمة هي Hsoub Alaraby، وحين نحاول قراءة تلك القيمة في صدفة فرعية فإننا نحصل على إجابة فارغة (يظهر أمر echo قيمة فارغة -null string-).

نخرج الآن من الصدفة الفرعية ونصدّر متغير full_name ونحن في الصدفة الأم، ثم نفتح صدفة فرعية جديدة ونطلب قيمة المتغير full_name مرة أخرى، فنحصل هذه المرة على قيمته (Hsoub Alaraby)، ذلك أن المتغير صار مرئيًا للصدفة الفرعية بعد تصديره.

نستطيع تغيير قيمة المتغير داخل الصدفة الفرعية كما ترى في المثال إلى (Osama H. Damarany)، لكن حين نخرج من تلك الصدفة ونعود إلى الصدفة الأم لنطلب قيمة المتغير نفسه، فإننا نحصل على القيمة الأولى (Hsoub Alaraby)، فلم تتأثر قيمته في الصدفة الأم بتغيرها داخل صدفة فرعية.

المتغيرات المحفوظة

المتغيرات المحفوظة في صدفة بورن

تستخدم Bash بعض المتغيرات بنفس الطريقة التي تستخدمها صدفة بورن بها، وتعطي bash في بعض الحالات قيمة افتراضية للمتغير، يعطي الجدول التالي نظرة عامة على تلك المتغيرات:

جدول 3.1 : المتغيرات المحفوظة في صدفة بورن

اسم المتغير التعريف
CDPATH قائمة من المجلدات يفصل بين كل منها نقطتان ":" تُستخدم كمسار للبحث لأمر cd.
HOME مجلد المنزل للمستخدم الحالي، وهو المجلد الافتراضي لأمر cd. يستخدم تَوسُّع المَدّة (tilde expansion) قيمة هذا المتغير أيضًا.
IFS قائمة من المحارف التي تفصل بين الحقول، تُستخدم حين تفصل الصدفة الكلمات كجزء من عملية التوسع.
MAIL عند تعيين أحد الملفات كقيمة لهذا المعامل فإن bash تُشعر المستخدم بوصول بريد في ذلك الملف، بشرط ألا يُضبط متغير MAILPATH على أي قيمة.
MAILPATH قائمة بأسماء الملفات تفصل بينها نقطتان رأسيتان. تتفقد bash تلك القائمة دوريًا لترى إن كانت هناك رسائل بريدية جديدة.
OPTARG قيمة آخر وسيط خياري (option argument) عالجه أمر getopts.
OPTIND فهرس (index) لآخر وسيط خياري (option argument) عالجه أمر getopts.
PATH قائمة من المجلدات التي يفصل بين كل منها نقطتان رأسيتان ":" تبحث فيها bash عن الأوامر.
PS1 النص الأساسي للمحث، وقيمته الافتراضية هي "' $\s-\v\'" .
PS2 النص الثانوي للمحث، وقيمته الافتراضية هي "" <"" .

المتغيرات المحفوظة في صدفة Bash

تُضبط هذه المتغيرات أو تُستخدم من قِبل Bash، أما بقية الصدفات فلا تعاملها بشكل خاص عما سواها:

جدول 3.2 : المتغيرات المحفوظة في صدفة Bash

اسم المتغير التعريف
auto_resume يتحكم هذا المتغير في كيفية تفاعل الصدفة مع المستخدم والتحكم في الوظائف (Job Control).
BASH الاسم الكامل للمسار المُستخدَم في تنفيذ النسخة الحالية من Bash
BASH_ENV إن ضُبط هذا المتغير عند استدعاء bash من أجل تنفيذ برنامج للصدفة (shell script) فإن قيمته تتوسع ويُستخدم كاسم لملف بدء تشغيل (startup file) يُقرأ قبل تنفيذ البرنامج.
BASH_VERSION رقم الإصدار للنسخة الحالية من Bash.
BASH_VERSINFO متغير مصفوفة للقراءة فقط، تحمل عناصره معلومات عن إصدارة النسخة الحالية من Bash.
COLUMNS يستخدم أمر select هذا المتغير لتحديد عرض الطرفية عند طباعة قوائم الاختيار، ويُضبط تلقائيًا عند تلقي إشارة SIGWINCH .
COMP_CWORD فهرس إلى {COMP_WORDS}$ من الكلمة التي تحتوي الموضع الحالي للمؤشر.
COMP_LINE سطر الأوامر الحالي.
COMP_POINT فهرس للموضع الحالي للمؤشر بالنسبة لبداية الأمر الحالي.
COMP_WORDS متغير مصفوفة يتكون من كلمات منفردة في سطر الأوامر الحالي.
COMPREPLY متغير مصفوفة تقرأ منه Bash الاحتمالات الممكنة للإكمال، والمولَّدة عبر دالة مستدعاة من قِبل أداة إكمال قابلة للبرمجة (programmable).
DIRSTACK متغير مصفوفة به المحتويات الحالية لمكدّس المجلدات.
EUID المعرّف الرقمي الفعّال للمستخدم الحالي.
FCEDIT المحرر المستخدم افتراضيًا من قِبل خيار e- لأمر fc.
FIGNORE قائمة لواحق (suffixes) يفصل بين كل منها نقطتان رأسيتان، يتم تجاهلها عند إكمال اسم ملف ما.
FUNCNAME اسم أي دالة للصدفة تُنفّذ حاليًا.
GLOBIGNORE قائمة من الأنماط التي تحدد مجموعة أسماء الملفات التي يتم تجاهلها من قِبل توسُّع اسم الملف (file name expansion).
GROUPS متغير مصفوفة يحتوي قائمة من المجموعات التي ينتمي إليها المستخدم الحالي.
histchars مجموعة محارف (بحد أقصى 3) تتحكم في توسع التأريخ، والاستبدال السريع والترميز (tokenization).
HISTCMD رقم التأريخ أو فهرس في قائمة التأريخ للأمر الحالي.
HISTCONTROL يحدد ما إن كان أمر ما قد أضيف إلى ملف التأريخ.
HISTFILE اسم الملف الذي يُحفظ فيه تأريخ الأوامر، تكون قيمته bash_history./~ افتراضيًا.
HISTFILESIZE أقصى عدد من الأسطر التي يمكن استيعابها في ملف تأريخ، يُضبط افتراضيًا على 500.
HISTIGNORE قائمة من الأنماط المستخدمة في تحديد أسطر الأوامر التي يجب أن تُحفظ في قائمة التأريخ.
HISTSIZE أقصى عدد من الأوامر التي يمكن حفظها في قائمة التأريخ، الحد الافتراضي هو 500.
HOSTFILE يحتوي اسم ملف بنفس صيغة etc/hosts/ الذي يجب أن يُقرأ عندما تحتاج الصدفة أن تكمل اسم المضيف (hostname).
HOSTNAME اسم المُضيف الحالي.
HOSTTYPE نص يصف الحاسوب/الآلة التي تعمل Bash عليها.
IGNOREEOF يتحكم هذا المتغير في الإجراء الذي تتخذه الصدفة عند استلام محرف EOF كمُدخَل وحيد.
INPUTRC اسم ملف تهيئة Readline، يحل هذا محل etc/inputrc/ الافتراضي.
LANG يُستخدم لتحديد التصنيف الموضعي لأي تصنيف لم يتم اختياره تحديدًا بمتغير يبدأ بـ _LC .
LC_ALL يلغي هذا المتغير قيمة LANG وأي متغير _LC آخر يحدد تصنيفًا موضعيًا.
LC_COLLATE يحدد هذا المتغير ترتيب المقارنة (collation order) المستخدم أثناء تصنيف نتائج توسعة اسم الملف (file name expansion)، ويحدد سلوك تعبيرات المدى (range expressions) وطبقات المعادلة (equivalence classes) وتسلسلات المقارنات (collating sequences) داخل توسعة اسم الملف، وكذلك ومطابقة الأنماط (pattern matching).
LC_CTYPE يحدد هذا المتغير تفسير المحارف وسلوك طبقات المحارف داخل توسعة اسم الملف ومطابقة الأنماط.
LC_MESSAGES This variable determines the locale used to translate double-quoted strings preceded by a "$" sign.

يحدد هذا المتغير الموضع المستخدم لترجمة النصوص التي بين علامتي تنصيص مزدوجة، والتي سُبقت بعلامة "$".

LC_NUMERIC يحدد هذا المتغير موضع التصنيف المستخدم لتهيئة الرقم (number formatting).
LINENO رقم السطر الذي يُنفَّذ الآن في برنامج الصدفة (shell script) أو دالة الصدفة.
LINES يستخدم هذا المتغير بواسطة أمر select لتحديد طول العمود لطباعة قوائم الاختيار.
MACHTYPE نص يصف نوع النظام الذي تنفذه Bash، بصيغة GNU CPU-COMPANY-SYSTEM.
MAILCHECK الزمن -بالثواني- الذي يمضي حتى تتفقد الصدفة البريد داخل الملفات المحددة في متغيرات MAIL و MAILPATH.
OLDPWD المجلد العامل السابق الذي حدده أمر cd.
OPTERR إن ضُبطت قيمة هذا المتغير على 1 فإن Bashتعرض رسائل خطأ مولّدة بواسطة أمر getopts.
OSTYPE نص يصف نظام التشغيل العاملة عليه Bash.
PIPESTATUS متغير مصفوفة يحتوي قائمة بها قِيَم حالات الخروج من العمليات التي في أنبوب الواجهة (foreground pipeline) الذي نُفِّذ حديثًا (قد يحتوي أمرًا واحدًا فقط).
POSIXLY_CORRECT If this variable is in the environment when bash starts, the shell enters POSIX mode.
PPID The process ID of the shell's parent process.
PROMPT_COMMAND If set, the value is interpreted as a command to execute before the printing of each primary prompt (PS1).
PS3 The value of this variable is used as the prompt for the select command. Defaults to "'#? '"
PS4 The value is the prompt printed before the command line is echoed when the -x option is set; defaults to "'+ '".
PWD The current working directory as set by the cd built-in command.
RANDOM Each time this parameter is referenced, a random integer between 0 and 32767 is generated. Assigning a value to this variable seeds the random number generator.
REPLY The default variable for the readbuilt-in.
SECONDS This variable expands to the number of seconds since the shell was started.
SHELLOPTS A colon-separated list of enabled shell options.
SHLVL Incremented by one each time a new instance of Bash is started.
TIMEFORMAT The value of this parameter is used as a format string specifying how the timing information for pipelines prefixed with the time reserved word should be displayed.
TMOUT If set to a value greater than zero, TMOUT is treated as the default timeout for the read built-in. In an interative shell, the value is interpreted as the number of seconds to wait for input after issuing the primary prompt when the shell is interactive. Bash terminates after that number of seconds if input does not arrive.
UID The numeric, real user ID of the current user.