دليل احترافي لتخصيص ملف .bashrc: إضافة الاختصارات والدوال وتحسين سطر أوامر Bash

دقائق القراءة: 10

ما هو ملف .bashrc ولماذا يستحق التخصيص؟

يُعد ملف .bashrc أحد الملفات الأساسية في بيئات Linux، ويوجد عادةً داخل المجلد الرئيسي للمستخدم. تكمن أهميته في أنه يُنفَّذ عند فتح جلسة طرفية جديدة من نوع Bash، ما يجعله المكان المثالي لإضافة إعداداتك الشخصية، وأوامرك المختصرة، ودوالك المتكررة، وحتى تخصيص شكل موجه الأوامر.

تخصيص هذا الملف لا يقتصر على الجانب الشكلي، بل ينعكس مباشرة على سرعة عملك وكفاءتك اليومية. فمن خلاله يمكنك:

  • تسريع كتابة الأوامر عبر aliases.
  • إعادة استخدام أوامر مركبة من خلال functions.
  • إظهار معلومات مفيدة عن النظام عند تشغيل الطرفية.
  • تحسين مظهر موجه Bash ليصبح أوضح وأكثر عملية.

دليل تخصيص ملف bashrc في لينكس لإضافة الاختصارات والدوال وتحسين سطر الأوامر

كيف تبدأ تحرير ملف .bashrc؟

يمكنك فتح الملف باستخدام محرر نصوص مثل vim أو أي محرر تفضله:

$ vim ~/.bashrc

بعد إجراء التعديلات، احرص على إعادة تحميل الملف حتى تُطبَّق التغييرات فوراً دون الحاجة إلى تسجيل الخروج:

$ source ~/.bashrc

إعداد سجل الأوامر Bash History بشكل أكثر فاعلية

يحتفظ Bash بسجل للأوامر التي تنفذها، ويمكن تحسين هذا السجل ليصبح أكثر فائدة في المراجعة والتتبع.

إضافة التاريخ والوقت إلى السجل

لجعل كل أمر محفوظاً مع تاريخ ووقت التنفيذ، أضف السطر التالي:

HISTTIMEFORMAT="%F %T "

سيظهر السجل بطريقة مشابهة لما يلي:

# Output
$ history
1017 20210228 10:51:28 uptime
1019 20210228 10:52:42 free -m
1020 20210228 10:52:49 tree --dirsfirst -F
1018 20210228 10:51:38 xrandr | awk '/\*/{print $1}'

تجاهل الأوامر المكررة

إذا كنت تنفذ الأمر نفسه أكثر من مرة، فقد لا ترغب في تكراره داخل السجل. يمكن ضبط ذلك هكذا:

HISTCONTROL=ignoredups

تحديد عدد الأسطر المحفوظة

يمكنك ضبط عدد الأوامر المحفوظة في الذاكرة وفي ملف السجل عبر السطرين التاليين:

HISTSIZE=2000
HISTFILESIZE=2000

إلحاق السجل بدلاً من استبداله

افتراضياً قد يُستبدل السجل القديم عند إغلاق الجلسة. لتجنّب ذلك، استخدم خيار histappend عبر الأمر shopt، وهو اختصار لعبارة shell options:

shopt -s histappend

ولعرض جميع خيارات الصدفة الحالية:

$ shopt -p
# Output
$ shopt -p
shopt -u autocd
shopt -u assoc_expand_once
shopt -u cdable_vars
shopt -u cdspell
shopt -u checkhash
shopt -u checkjobs
shopt -s checkwinsize

تفعيل نمط vi داخل سطر الأوامر

إذا كنت معتاداً على اختصارات محرر Vim، فيمكنك تمكين وضع التحرير الخاص به داخل الطرفية من خلال السطر التالي:

set -o vi

هذا الإعداد مفيد جداً للمستخدمين الذين يفضلون التنقل السريع وتحرير الأوامر بنفس أسلوب vim.

إضافة ألوان إلى موجه Bash

يمكنك تعريف متغيرات ألوان لاستخدامها لاحقاً في تخصيص موجه الأوامر:

blk='\[\033[01;30m\]' # Black
red='\[\033[01;31m\]' # Red
grn='\[\033[01;32m\]' # Green
ylw='\[\033[01;33m\]' # Yellow
blu='\[\033[01;34m\]' # Blue
pur='\[\033[01;35m\]' # Purple
cyn='\[\033[01;36m\]' # Cyan
wht='\[\033[01;37m\]' # White
clr='\[\033[00m\]' # Reset

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

كيفية إنشاء اختصارات Aliases داخل .bashrc

تُستخدم aliases لتقصير الأوامر الطويلة أو كثيرة التكرار. وبذلك تختصر الوقت وتقلل الأخطاء الكتابية.

الصيغة الأساسية تكون كالتالي:

alias <my_alias>='longer command'

كيف تعرف الأوامر الأنسب للاختصار؟

يمكنك تحليل سجل الأوامر لديك لمعرفة أكثر الأوامر استخداماً:

$ history | awk '{cmd[$2]++} END {for(elem in cmd) {print cmd[elem] " " elem}}' | sort -n -r | head -10
# Output
171 git
108 cd
62 vim
51 python3
38 history
32 exit
30 clear
28 tmux
28 tree
27 ls

إذا كان git من أكثر الأوامر استخداماً لديك، فمن المنطقي إنشاء مجموعة اختصارات له.

اختصارات مفيدة لأوامر Git

# View Git status.
alias gs='git status'
# Add a file to Git.
alias ga='git add'
# Add all files to Git.
alias gaa='git add --all'
# Commit changes to the code.
alias gc='git commit'
# View the Git log.
alias gl='git log --oneline'
# Create a new Git branch and move to the new branch at the same time.
alias gb='git checkout -b'
# View the difference.
alias gd='git diff'

اختصارات للتنقل وإدارة الطرفية

# Move to the parent folder.
alias ..='cd ..;pwd'
# Move up two parent folders.
alias ...='cd ../..;pwd'
# Move up three parent folders.
alias ....='cd ../../..;pwd'
# Press c to clear the terminal screen.
alias c='clear'
# Press h to view the bash history.
alias h='history'
# Display the directory structure better.
alias tree='tree --dirsfirst -F'
# Make a directory and all parent directories with verbosity.
alias mkdir='mkdir -p -v'

اختصارات لعرض التقويم الشهري

إذا كنت تستخدم الأمر cal كثيراً، فيمكنك إنشاء اختصارات سريعة لكل شهر:

# View the calender by typing the first three letters of the month.
alias jan='cal -m 01'
alias feb='cal -m 02'
alias mar='cal -m 03'
alias apr='cal -m 04'
alias may='cal -m 05'
alias jun='cal -m 06'
alias jul='cal -m 07'
alias aug='cal -m 08'
alias sep='cal -m 09'
alias oct='cal -m 10'
alias nov='cal -m 11'
alias dec='cal -m 12'
# Output
$ mar
March 2021
Su Mo Tu We Th Fr Sa
   1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

متى تستخدم الدوال Functions بدلاً من الاختصارات؟

الاختصارات ممتازة للأوامر القصيرة، لكن عندما تحتاج إلى منطق أكثر تعقيداً أو أكثر من خطوة، تكون الدوال هي الخيار الأفضل.

الصيغة الأساسية للدالة هي:

function funct_name () {
  # code
}

دالة للعثور على أكبر الملفات داخل مجلد

هذه الدالة مفيدة لتحديد الملفات التي تستهلك المساحة الأكبر:

function find_largest_files () {
  du -h -x -s -- * | sort -r -h | head -20;
}
# Output
Downloads
$ find_largest_files
709M systemrescue-8.00-amd64.iso
337M debian-10.8.0-amd64-netinst.iso
9.1M weather-icons-master.zip
6.3M Hack-font.zip
3.9M city.list.json.gz
2.8M dvdrental.tar
708K IMG_2600.JPG
100K sql_cheat_sheet_pgsql.pdf
4.0K repeating-a-string.txt
4.0K heart.svg
4.0K Fedora-Workstation-33-1.2-x86_64-CHECKSUM

إظهار الفرع الحالي من Git داخل الموجه

للحصول على موجه أكثر ذكاءً، يمكنك عرض اسم الفرع الحالي من مستودع Git تلقائياً:

# Display the current Git branch in the Bash prompt.
function git_branch () {
  if [ -d .git ] ; then
    printf "%s" "( $(git branch 2> /dev/null | awk '/\*/{print $2}') )" ;
  fi
}

# Set the prompt.
function bash_prompt (){
  PS1='${debian_chroot:+($debian_chroot)}'${blu}'$(git_branch)'${pur}' \W'${grn}' \$ '${clr}
}

bash_prompt

موجه Bash مخصص يعرض الفرع الحالي من Git بألوان واضحة

البحث داخل سجل الأوامر بسرعة

إذا كنت تبحث عن أمر استخدمته سابقاً، فهذه الدالة تختصر المهمة:

function hg () {
  history | grep " $1 " ;
}
# Output
$ hg vim
305 2021-03-02 16:47:33 vim .bashrc
307 2021-03-02 17:17:09 vim .tmux.conf

إنشاء مشروع جديد مع Git في خطوة واحدة

بدلاً من تنفيذ عدة أوامر يدوياً كل مرة، يمكنك تجميعها في دالة واحدة:

function git_init () {
  if [ -z "$1" ]; then
    printf "%s\n" "Please provide a directory name." ;
  else
    mkdir "$1" ;
    builtin cd "$1" ;
    pwd ;
    git init; touch readme.md .gitignore LICENSE; echo "# $(basename $PWD)" >> readme.md
  fi
}
# Output
$ git_init my_project
/home/brandon/my_project
Initialized empty Git repository in /home/brandon/my_project/.git/

الحصول على تقرير الطقس من الطرفية

يمكنك أيضاً إنشاء دالة تعرض حالة الطقس مباشرة من سطر الأوامر. ستحتاج إلى الأداتين curl وjq، بالإضافة إلى مفتاح API من خدمة OpenWeatherMap.

لتثبيت الأدوات المطلوبة:

$ sudo apt install curl jq
# OR
$ sudo dnf install curl jq
function weather_report () {
  local response=$(curl --silent 'https://api.openweathermap.org/data/2.5/weather?id=5128581&units=imperial&appid=<YOUR_API_KEY>')
  local status=$(echo $response | jq -r '.cod')

  # Check for the 200 response indicating a successful API query.
  case $status in
    200)
      printf "Location: %s %s\n" "$(echo $response | jq '.name') $(echo $response | jq '.sys.country')"
      printf "Forecast: %s\n" "$(echo $response | jq '.weather[].description')"
      printf "Temperature: %.1f°F\n" "$(echo $response | jq '.main.temp')"
      printf "Temp Min: %.1f°F\n" "$(echo $response | jq '.main.temp_min')"
      printf "Temp Max: %.1f°F\n" "$(echo $response | jq '.main.temp_max')"
      ;;
    401)
      echo "401 error"
      ;;
    *)
      echo "error"
      ;;
  esac
}
# Output
$ weather_report
Location: "New York" "US"
Forecast: "clear sky"
Temperature: 58.0°F
Temp Min: 56.0°F
Temp Max: 60.8°F

عرض معلومات النظام عند تشغيل الطرفية

من الإضافات العملية في ملف .bashrc إظهار ملخص سريع عن الجهاز والنظام فور فتح الطرفية. هذا مفيد خصوصاً للمطورين ومديري الأنظمة.

clear
printf "\n"
printf " %s\n" "IP ADDR: $(curl ifconfig.me)"
printf " %s\n" "USER: $(echo $USER)"
printf " %s\n" "DATE: $(date)"
printf " %s\n" "UPTIME: $(uptime -p)"
printf " %s\n" "HOSTNAME: $(hostname -f)"
printf " %s\n" "CPU: $(awk -F: '/model name/{print $2}' | head -1)"
printf " %s\n" "KERNEL: $(uname -rms)"
printf " %s\n" "PACKAGES: $(dpkg --get-selections | wc -l)"
printf " %s\n" "RESOLUTION: $(xrandr | awk '/\*/{printf $1 " " }')"
printf " %s\n" "MEMORY: $(free -m -h | awk '/Mem/{print $3 "/" $2}')"
printf "\n"

عرض معلومات النظام في الطرفية باستخدام bashrc مثل الذاكرة والنواة واسم الجهاز

تجميعة كاملة لإعدادات .bashrc

إذا كنت تريد وضع معظم هذه التخصيصات دفعة واحدة، فيمكنك إضافتها أسفل الإعدادات الافتراضية في الملف:

########################################################################
#
# ██████╗  █████╗ ███████╗██╗  ██╗██████╗  ██████╗
# ██╔══██╗██╔══██╗██╔════╝██║  ██║██╔══██╗██╔════╝
# ██████╔╝███████║███████╗███████║██████╔╝██║
# ██╔══██╗██╔══██║╚════██║██╔══██║██╔══██╗██║
# ██████╔╝██║  ██║███████║██║  ██║██║  ██║╚██████╗
# ╚═════╝ ╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝ ╚═════╝
#
########################################################################

set -o vi
HISTTIMEFORMAT="%F %T "
HISTCONTROL=ignoredups
HISTSIZE=2000
HISTFILESIZE=2000
shopt -s histappend

blk='\[\033[01;30m\]' # Black
red='\[\033[01;31m\]' # Red
grn='\[\033[01;32m\]' # Green
ylw='\[\033[01;33m\]' # Yellow
blu='\[\033[01;34m\]' # Blue
pur='\[\033[01;35m\]' # Purple
cyn='\[\033[01;36m\]' # Cyan
wht='\[\033[01;37m\]' # White
clr='\[\033[00m\]' # Reset

alias gs='git status'
alias ga='git add'
alias gaa='git add --all'
alias gc='git commit'
alias gl='git log --oneline'
alias gb='git checkout -b'
alias gd='git diff'
alias ..='cd ..;pwd'
alias ...='cd ../..;pwd'
alias ....='cd ../../..;pwd'
alias c='clear'
alias h='history'
alias tree='tree --dirsfirst -F'
alias mkdir='mkdir -p -v'
alias jan='cal -m 01'
alias feb='cal -m 02'
alias mar='cal -m 03'
alias apr='cal -m 04'
alias may='cal -m 05'
alias jun='cal -m 06'
alias jul='cal -m 07'
alias aug='cal -m 08'
alias sep='cal -m 09'
alias oct='cal -m 10'
alias nov='cal -m 11'
alias dec='cal -m 12'

function hg () {
  history | grep " $1 " ;
}

function find_largest_files () {
  du -h -x -s -- * | sort -r -h | head -20;
}

function git_branch () {
  if [ -d .git ] ; then
    printf "%s" "( $(git branch 2> /dev/null | awk '/\*/{print $2}') )" ;
  fi
}

function bash_prompt (){
  PS1='${debian_chroot:+($debian_chroot)}'${blu}'$(git_branch)'${pur}' \W'${grn}' \$ '${clr}
}

bash_prompt

function git_init () {
  if [ -z "$1" ]; then
    printf "%s\n" "Please provide a directory name." ;
  else
    mkdir "$1" ;
    builtin cd "$1" ;
    pwd ;
    git init; touch readme.md .gitignore LICENSE; echo "# $(basename $PWD)" >> readme.md
  fi
}

function weather_report () {
  local response=$(curl --silent 'https://api.openweathermap.org/data/2.5/weather?id=5128581&units=imperial&appid=<YOUR_API_KEY>')
  local status=$(echo $response | jq -r '.cod')
  case $status in
    200)
      printf "Location: %s %s\n" "$(echo $response | jq '.name') $(echo $response | jq '.sys.country')"
      printf "Forecast: %s\n" "$(echo $response | jq '.weather[].description')"
      printf "Temperature: %.1f°F\n" "$(echo $response | jq '.main.temp')"
      printf "Temp Min: %.1f°F\n" "$(echo $response | jq '.main.temp_min')"
      printf "Temp Max: %.1f°F\n" "$(echo $response | jq '.main.temp_max')"
      ;;
    401)
      echo "401 error"
      ;;
    *)
      echo "error"
      ;;
  esac
}

clear
printf "\n"
printf " %s\n" "IP ADDR: $(curl ifconfig.me)"
printf " %s\n" "USER: $(echo $USER)"
printf " %s\n" "DATE: $(date)"
printf " %s\n" "UPTIME: $(uptime -p)"
printf " %s\n" "HOSTNAME: $(hostname -f)"
printf " %s\n" "CPU: $(awk -F: '/model name/{print $2}' | head -1)"
printf " %s\n" "KERNEL: $(uname -rms)"
printf " %s\n" "PACKAGES: $(dpkg --get-selections | wc -l)"
printf " %s\n" "RESOLUTION: $(xrandr | awk '/\*/{printf $1 " " }')"
printf " %s\n" "MEMORY: $(free -m -h | awk '/Mem/{print $3 "/" $2}')"
printf "\n"

أفضل ممارسات عند تعديل ملف .bashrc

  • أضف التعديلات تدريجياً، ثم اختبرها قبل الانتقال إلى تغييرات أكبر.
  • احتفظ بنسخة احتياطية من الملف قبل أي تعديل مهم.
  • تجنب إضافة أوامر بطيئة جداً إذا كنت لا تريد إبطاء فتح الطرفية.
  • احرص على أن تكون الأسماء المختصرة واضحة وسهلة التذكر.
  • إذا كنت تعمل على عدة أجهزة، ففكر في حفظ ملف .bashrc ضمن مستودع Git خاص بإعداداتك الشخصية.

الخلاصة التقنية

يُعد تخصيص ملف .bashrc من أبسط الخطوات التي تمنحك أثراً كبيراً على الإنتاجية في بيئة Linux. عبر الجمع بين تحسين سجل الأوامر، وإضافة aliases ذكية، وكتابة functions عملية، وتخصيص موجه Bash، يمكنك تحويل الطرفية من أداة تقليدية إلى مساحة عمل أسرع وأكثر وضوحاً. من الناحية التقنية، أفضل نهج هو البدء بإعدادات خفيفة ومستقرة، ثم التوسع تدريجياً بما يناسب أسلوب عملك الفعلي، لا بما يبدو جذاباً فقط.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *