آر اسٹوڈیو میں گٹ کلون کی خرابیوں کو حل کرنا: راستہ پہلے سے موجود مسئلہ ہے۔

Git

آر اسٹوڈیو میں گٹ انٹیگریشن کو ہموار کرنا

Git کو RStudio میں سیٹ کرنا عام طور پر ایک سیدھا سا عمل ہوتا ہے، لیکن غلطیوں کا سامنا کرنا اسے مشکل محسوس کر سکتا ہے۔ آر اسٹوڈیو پروجیکٹ میں گٹ ریپوزٹری کو کلون کرتے وقت ایک عام مسئلہ ایک غلطی کا پیغام ہے جو کہتا ہے، "" 😕 یہ مسئلہ اپنی پٹریوں میں پیش رفت کو روک سکتا ہے۔

تصور کریں کہ آپ کسی پروجیکٹ میں غوطہ لگانے کے لیے بالکل تیار ہیں، صرف اس روڈ بلاک کا سامنا کرنے کے لیے۔ آپ معمول کے مراحل کی پیروی کرتے ہیں، لیکن کامیاب کلون کے بجائے، آپ کو ایک مبہم کمانڈ لائن غلطی کا سامنا کرنا پڑا۔ بہت سے لوگوں کے لئے، یہ غلطی Git انضمام کو ایک مددگار ٹول کے بجائے ایک مشکل رکاوٹ کی طرح محسوس کر سکتی ہے۔

یہ خرابی عام طور پر اس وقت ہوتی ہے جب ٹارگٹ فولڈر میں پہلے سے ہی فائلیں ہوتی ہیں، اور اسے اکثر مسائل حل کرنے کے چند آسان مراحل سے حل کیا جا سکتا ہے۔ یہ سمجھنا کہ ایسا کیوں ہوتا ہے، اس کے ساتھ ساتھ راستے کو صاف کرنے اور ہر چیز کو آسانی سے چلانے کے لیے کچھ حکمت عملی سیکھنا بھی اہم ہے۔

آئیے اس خامی کو دور کرنے کے عملی طریقے تلاش کریں اور RStudio میں اپنے پروجیکٹ سیٹ اپ کے ساتھ آگے بڑھیں۔ صحیح ایڈجسٹمنٹ کے ساتھ، آپ مستقبل میں اسی طرح کے مسائل سے بچنے کے لیے حل سے آراستہ، کچھ ہی دیر میں ٹریک پر آ جائیں گے! 🚀

حکم وضاحت اور استعمال کی مثال
os.path.exists() یہ کمانڈ چیک کرتا ہے کہ آیا کوئی مخصوص ڈائریکٹری یا فائل پاتھ موجود ہے۔ ہماری اسکرپٹ میں، اس کا استعمال اس بات کی تصدیق کرنے کے لیے کیا جاتا ہے کہ آیا کلوننگ کے لیے ٹارگٹ ڈائرکٹری کسی بھی کارروائی کو آگے بڑھانے سے پہلے پہلے سے موجود ہے۔ مثال: اگر os.path.exists(ڈائریکٹری):
os.listdir() دی گئی ڈائرکٹری میں تمام فائلوں اور ذیلی ڈائریکٹریوں کی فہرست بنانے کے لیے استعمال کیا جاتا ہے۔ اس تناظر میں، یہ اس بات کا تعین کرنے میں مدد کرتا ہے کہ آیا ڈائریکٹری خالی ہے یا اس میں مشمولات ہیں، جو مشروط ہینڈلنگ کی اجازت دیتا ہے۔ مثال: if os.listdir(directory):
shutil.rmtree() یہ کمانڈ پوری ڈائرکٹری اور اس کے مواد کو بار بار ہٹاتا ہے۔ ریپوزٹری کو دوبارہ کلون کرتے وقت تنازعات سے بچنے کے لیے موجودہ غیر خالی ڈائرکٹری کو صاف کرنا یہاں بہت ضروری ہے۔ مثال: shutil.rmtree(ڈائریکٹری)
subprocess.run() Python اسکرپٹ کے اندر سے ایک شیل کمانڈ پر عمل درآمد کرتا ہے۔ یہ Git clone کمانڈ کو چلانے کے لیے استعمال ہوتا ہے اور check=True کے ساتھ، ناکامی پر اسکرپٹ کے رک جانے کو یقینی بناتا ہے۔ مثال: subprocess.run(["git", "clone", repo_url, Directory], check=True)
git2r::clone() یہ R کمانڈ گٹ ریپوزٹری کو ایک مخصوص ڈائریکٹری میں کلون کرتا ہے، جو ٹرمینل میں Git clone کمانڈ کے برابر ہے۔ ڈیٹا پروجیکٹس میں سیملیس گٹ انضمام کے لیے R میں استعمال کیا جاتا ہے۔ مثال: git2r::clone(repo_url، dir_path)
dir_delete() R میں fs لائبریری کی ایک کمانڈ، یہ ایک مخصوص ڈائریکٹری کو حذف کر دیتی ہے۔ اسکرپٹ میں، یہ موجودہ ٹارگٹ ڈائرکٹری کو صاف کرتا ہے اگر اس کے پاس فائلیں ہیں، نئے کلون کی تیاری کرتے ہوئے۔ مثال: dir_delete(dir_path)
tryCatch() R میں، tryCatch() کوڈ بلاک کو چلانے کی کوشش کرکے اور نتیجے میں آنے والی کسی بھی غلطی کو پکڑ کر غلطی سے نمٹنے کی اجازت دیتا ہے۔ یہ کلون آپریشن کے دوران ممکنہ مسائل سے نمٹنے کے لیے استعمال ہوتا ہے۔ مثال: tryCatch({ ... }, error = function(e) {...})
unittest.TestCase Python کے یونٹیسٹ ماڈیول میں ایک نئے ٹیسٹ کیس کی وضاحت کرتا ہے۔ یہ فریم ورک اس بات کی تصدیق کرنے میں مدد کرتا ہے کہ کوڈ کا ہر حصہ مختلف منظرناموں کے تحت صحیح طریقے سے کام کرتا ہے، جیسے کہ ڈائرکٹری موجود ہونے یا خالی ہونے پر۔ مثال: کلاس TestGitClone(unittest.TestCase):
dir_ls() Lists all files in a specified directory in R, useful for checking if a directory contains files. In our example, it helps decide whether to delete or keep the directory. Example: if (length(dir_ls(dir_path)) >R میں مخصوص ڈائریکٹری میں تمام فائلوں کی فہرست، یہ جانچنے کے لیے مفید ہے کہ آیا ڈائریکٹری میں فائلیں ہیں۔ ہماری مثال میں، یہ فیصلہ کرنے میں مدد کرتا ہے کہ ڈائرکٹری کو حذف کرنا ہے یا رکھنا ہے۔ مثال: اگر (لمبائی(dir_ls(dir_path)) > 0)
cat() یہ R کمانڈ کنسول پر پیغامات پرنٹ کرتی ہے، جو کلوننگ کے عمل اور دشواری حل کرنے کے اقدامات پر رائے دینے کے لیے مفید ہے۔ یہ ڈیبگنگ اور رپورٹنگ اسٹیٹس کے لیے استعمال ہوتا ہے۔ مثال: بلی ("کامیابی سے کلون کیا گیا")

RStudio پروجیکٹس میں گٹ کلوننگ کی خرابیوں کو ہینڈل کرنا

RStudio میں Git repositories کے ساتھ کام کرتے وقت، پہلے سے موجود ڈائرکٹری میں کسی پروجیکٹ کو کلون کرنے کی کوشش کرتے وقت ایک عام غلطی ہو سکتی ہے۔ یہ غلطی عام طور پر "منزل کا راستہ پہلے سے موجود ہے اور خالی ڈائرکٹری نہیں ہے" کے طور پر ظاہر ہوتی ہے، جس سے ظاہر ہوتا ہے کہ مخصوص ڈائرکٹری میں مواد پہلے سے موجود ہے۔ یہ خاص طور پر متعلقہ منصوبوں پر کام کرتے وقت متعلقہ ہے، جہاں فائلوں کے متعدد ورژن ایک ہی جگہ پر ختم ہو سکتے ہیں۔ اس کو حل کرنے کے لیے، ہماری اسکرپٹ اس بات پر توجہ مرکوز کرتی ہے کہ آیا ٹارگٹ ڈائرکٹری موجود ہے اور آیا یہ خالی ہے۔ اگر ڈائرکٹری خالی نہیں ہے تو، اسکرپٹ کلون کے ساتھ آگے بڑھنے سے پہلے اس کے مواد کو حذف کر دیتے ہیں۔ یہ نقطہ نظر دستی کلیئرنگ سے گریز کرتا ہے اور ہموار گٹ انضمام کو قابل بناتا ہے۔ . 😊

ہر اسکرپٹ ایک ہی مسئلے سے نمٹنے کے لیے مختلف پروگرامنگ کے طریقے استعمال کرتا ہے، جس سے ماحول کی بنیاد پر موافقت کرنا آسان ہو جاتا ہے۔ Python اسکرپٹ، مثال کے طور پر، استعمال کرتا ہے اور لائبریریوں کو ڈائریکٹریز کے وجود کی جانچ کرنے اور اگر ضروری ہو تو انہیں ہٹانے کے لیے۔ خاص طور پر، چیک کرتا ہے کہ آیا ڈائریکٹری موجود ہے، جبکہ shutil.rmtree() اگر یہ خالی نہیں ہے تو اسے صاف کرتا ہے، گٹ کلون کمانڈ کو ناکام ہونے سے روکتا ہے۔ ایک بار ڈائرکٹری صاف ہونے کی تصدیق ہو گئی، ازگر کمانڈ ریپوزٹری کو کلون کرنے کے لیے "گٹ کلون" کمانڈ چلاتی ہے۔ کلوننگ کے دوران غلطیوں کو پکڑ کر، یہ سیٹ اپ ڈویلپرز کو ہر بار ڈائرکٹری کے مواد کو دستی طور پر چیک کیے بغیر ٹریک پر رہنے میں مدد کرتا ہے۔

استعمال کرنے والوں کے لیے یونکس پر مبنی نظاموں پر، نقطہ نظر قدرے مختلف ہے لیکن ایک ہی نتیجہ حاصل کرتا ہے۔ شیل اسکرپٹ "-d" جھنڈے والی موجودہ ڈائریکٹری کو چیک کرنے کے لیے "if" حالت کا استعمال کرتی ہے۔ اگر ڈائرکٹری میں فائلیں ہیں، تو اسکرپٹ ریپوزٹری کو کلون کرنے کے لیے "گٹ کلون" چلانے سے پہلے ہر چیز کو ہٹانے کے لیے "rm -rf" کا استعمال کرتی ہے۔ یہ ہموار شیل اپروچ ان لوگوں کے لیے مثالی ہے جو سرورز پر کام کر رہے ہیں یا Git کو CI/CD پائپ لائنز کے ساتھ مربوط کر رہے ہیں، جہاں ہر آپریشن خودکار اور دستی مداخلت سے پاک ہونا چاہیے۔ یہ طریقہ بھی تیز اور موثر ہے، جب ایک سے زیادہ ڈویلپرز کو ایک ہی ذخیرہ کی ساخت کو کلون کرنے کی ضرورت ہوتی ہے تو تیزی سے فیڈ بیک کو قابل بناتا ہے۔

R اسکرپٹ، خاص طور پر RStudio صارفین کے لیے لکھا گیا ہے، اس کا فائدہ اٹھاتا ہے۔ اور ڈائریکٹریز اور گٹ فنکشنز کو براہ راست R ماحول میں منظم کرنے کے لیے پیکجز۔ fs::dir_exists() کا استعمال کرتے ہوئے، اسکرپٹ پہلے چیک کرتا ہے کہ آیا مخصوص ڈائریکٹری موجود ہے۔ اگر یہ کرتا ہے اور خالی نہیں ہے، fs::dir_delete() اس کے مواد کو ہٹاتا ہے، کلوننگ کے لیے صاف سیٹ اپ کو یقینی بناتا ہے۔ git2r::clone() فنکشن پھر ریپوزٹری کو براہ راست کلیئرڈ ڈائرکٹری میں کلون کرتا ہے، جو RStudio کے اندر بغیر کسی رکاوٹ کے Git انضمام فراہم کرتا ہے۔ tryCatch() کے ساتھ غلطیوں کو سنبھالنے سے، اگر کلوننگ ناکام ہو جاتی ہے تو R اسکرپٹ معنی خیز پیغامات دیتا ہے، R صارفین کے لیے ٹربل شوٹنگ کو سیدھا بناتا ہے۔ 🚀

گٹ کلون کی خرابی کو حل کرنا: RStudio میں 'منزل کا راستہ پہلے سے موجود ہے'

کلوننگ سے پہلے موجودہ ڈائریکٹری کا پتہ لگانے اور صاف کرنے کے لیے اسکرپٹ

# This script checks if the target directory already exists and clears it if not empty before cloning the repository
import os
import shutil
import subprocess
# Define the target directory path and repository URL
directory = "tues"
repo_url = "https://github.com/sp24ach/tues.git"
# Check if directory exists and is not empty
if os.path.exists(directory):
    if os.listdir(directory):  # Directory is not empty
        print(f"Directory '{directory}' already exists and is not empty. Clearing the directory...")
        shutil.rmtree(directory)  # Remove the directory and its contents
    else:
        print(f"Directory '{directory}' exists but is empty. Proceeding...")
else:
    print(f"Directory '{directory}' does not exist. Proceeding to clone...")
# Clone the Git repository
try:
    subprocess.run(["git", "clone", repo_url, directory], check=True)
    print(f"Successfully cloned '{repo_url}' into '{directory}'")
except subprocess.CalledProcessError as e:
    print(f"Error during cloning: {e}")

گٹ ڈائرکٹری چیک اور کلون آپریشن کا انتظام کرنے کے لیے شیل اسکرپٹ کا استعمال

ڈائرکٹری مینجمنٹ اور کلوننگ کے لیے شیل اسکرپٹنگ

#!/bin/bash
# Define the target directory and repository URL
DIR="tues"
REPO_URL="https://github.com/sp24ach/tues.git"
# Check if directory exists and is not empty
if [ -d "$DIR" ]; then
    if [ "$(ls -A $DIR)" ]; then
        echo "Directory '$DIR' already exists and is not empty. Clearing it..."
        rm -rf "$DIR"
    else
        echo "Directory '$DIR' exists but is empty. Proceeding to clone..."
    fi
else
    echo "Directory '$DIR' does not exist. Proceeding to clone..."
fi
# Clone the repository
git clone "$REPO_URL" "$DIR"
if [ $? -eq 0 ]; then
    echo "Successfully cloned '$REPO_URL' into '$DIR'"
else
    echo "Failed to clone repository"
fi

R اسکرپٹ برائے کلوننگ اور RStudio میں ڈائریکٹری چیک کریں۔

Git انضمام کے لیے R اسکرپٹ، پہلے سے موجود ڈائریکٹریوں کا پتہ لگانا اور ہینڈل کرنا

# Load necessary libraries
library(fs)
library(git2r)
# Define the target directory and repository URL
dir_path <- "tues"
repo_url <- "https://github.com/sp24ach/tues.git"
# Check if the directory exists and contains files
if (dir_exists(dir_path)) {
    if (length(dir_ls(dir_path)) > 0) {
        cat("Directory '", dir_path, "' already exists and is not empty. Clearing directory...\\n")
        dir_delete(dir_path)
    } else {
        cat("Directory '", dir_path, "' exists but is empty. Proceeding...\\n")
    }
} else {
    cat("Directory '", dir_path, "' does not exist. Proceeding to clone...\\n")
}
# Clone the repository
tryCatch({
    git2r::clone(repo_url, dir_path)
    cat("Successfully cloned '", repo_url, "' into '", dir_path, "'\\n")
}, error = function(e) {
    cat("Error during cloning:", e$message, "\\n")
})

ڈائرکٹری چیکس اور گٹ کلوننگ کی فعالیت کے لیے یونٹ ٹیسٹ اسکرپٹ

ازگر میں مختلف ماحول کی جانچ کے لیے اسکرپٹ کی جانچ

# Import necessary libraries
import os
import subprocess
import unittest
# Define function to clear and clone directory
def clear_and_clone(dir_path, repo_url):
    if os.path.exists(dir_path) and os.listdir(dir_path):
        shutil.rmtree(dir_path)
    subprocess.run(["git", "clone", repo_url, dir_path], check=True)
# Unit test for clear_and_clone function
class TestGitClone(unittest.TestCase):
    def test_clone_directory_not_exists(self):
        clear_and_clone("test_repo", "https://github.com/sp24ach/tues.git")
        self.assertTrue(os.path.exists("test_repo"))
    def test_clone_directory_exists_empty(self):
        os.makedirs("test_repo", exist_ok=True)
        clear_and_clone("test_repo", "https://github.com/sp24ach/tues.git")
        self.assertTrue(os.path.exists("test_repo"))
if __name__ == "__main__":
    unittest.main()

RStudio میں گٹ کلوننگ کے دوران ڈائرکٹری کے تنازعات کو حل کرنا

RStudio میں گٹ ریپوزٹری قائم کرتے وقت، آپ کو "منزل کا راستہ پہلے سے موجود ہے" کی خرابی کا سامنا کرنا پڑ سکتا ہے اگر آپ کسی ایسے فولڈر میں کلوننگ کر رہے ہیں جس میں پہلے سے فائلیں ہیں۔ یہ باہمی تعاون کے منصوبوں میں ہو سکتا ہے یا جب ایک ڈویلپر کو ایک ہی پروجیکٹ کو مختلف سسٹمز پر کلون کرنے کی ضرورت ہو۔ اس خامی کو دور کرنا صرف موجودہ ڈائریکٹری کو حذف کرنے سے آگے ہے۔ بہت سے معاملات میں، آپ اس بات کو یقینی بنانا چاہیں گے کہ ضروری ڈیٹا کو برقرار رکھتے ہوئے صرف مخصوص فائلوں کو ہٹا دیا جائے۔ ایسے معاملات میں، ٹارگٹڈ اسکرپٹس کا استعمال کرتے ہوئے منتخب حذف کرنا آپ کے ورک اسپیس کو منظم رکھتے ہوئے ڈیٹا کے نقصان کو روک سکتا ہے۔ 🗂️

اس کو حاصل کرنے کے لیے، آپ مخصوص فائل کی اقسام یا نمونوں کو چیک کرنے کے لیے شیل اسکرپٹ یا پائیتھن اسکرپٹ میں ترمیم کر سکتے ہیں۔ مثال کے طور پر، ایک اسکرپٹ کو کوڈ فائلوں کو اچھوت چھوڑتے ہوئے صرف عارضی فائلوں کو حذف کرنے کے لیے سیٹ کیا جا سکتا ہے۔ ایک مشروط بیان شامل کرنا جیسے ازگر میں، یا Bash میں قسم کے لحاظ سے فائلوں کو فلٹر کرنے میں آپ کی مدد کر سکتا ہے۔ یہ لچکدار نقطہ نظر آپ کو Git ڈائریکٹریز کو زیادہ مؤثر طریقے سے منظم کرنے کے قابل بناتا ہے اور اس بات کو یقینی بناتا ہے کہ کلوننگ غیر مطلوبہ ڈائرکٹری تنازعات سے بلاتعطل ہے، جو خاص طور پر CI/CD ماحول میں مفید ہے جہاں آٹومیشن کلیدی ہے۔

ایک اور پہلو غور طلب ہے۔ گٹ میں مختلف شاخوں پر کام کرتے وقت، تبدیلیاں اور ڈائریکٹریز مختلف ہو سکتی ہیں، جو کلون کے دوران ممکنہ تنازعات پیدا کرتی ہیں۔ RStudio میں، آپ ریپوزٹری کے مخصوص ورژن کو کلون کرنے سے پہلے شاخوں کو تبدیل کرنے کے لیے ٹرمینل کا استعمال کر سکتے ہیں۔ . کلوننگ کے لیے برانچ کے مخصوص فولڈرز کا استعمال فائلوں کو اوور لیپ ہونے سے روکتا ہے اور بڑے ذخیروں کا انتظام کرتے وقت خاص طور پر مفید ہو سکتا ہے۔ یہ مشق آپ کو برقرار رکھتی ہے۔ اور اس ڈائرکٹری کے تنازعہ میں پڑنے کے امکانات کو کم کرتا ہے۔ 😊

RStudio میں گٹ کلوننگ کے عام مسائل کا ازالہ کرنا

  1. "منزل کا راستہ پہلے سے موجود ہے" کا کیا مطلب ہے؟
  2. اس ایرر کا مطلب ہے کہ کلوننگ کے لیے ٹارگٹ ڈائرکٹری پہلے سے موجود ہے اور خالی نہیں ہے۔ ڈائرکٹری کو صاف کرنا یا نیا ہدف فولڈر منتخب کرنا اکثر اس مسئلے کو حل کرتا ہے۔
  3. کلوننگ سے پہلے میں ڈائرکٹری میں صرف مخصوص فائلوں کو کیسے ڈیلیٹ کر سکتا ہوں؟
  4. ازگر میں، ایسی حالت استعمال کریں۔ فائلوں کو فلٹر کرنے کے لیے، یا Bash میں، کوشش کریں۔ مخصوص فائل کی اقسام کے لیے۔
  5. کیا میں ایک مختلف برانچ کا انتخاب کرکے اس غلطی سے بچ سکتا ہوں؟
  6. جی ہاں! کلوننگ استعمال کرنے سے پہلے آپ کسی مخصوص برانچ میں جا سکتے ہیں۔ . اس سے تنازعات سے بچنے میں مدد ملتی ہے اگر ہر برانچ میں الگ الگ فولڈر یا ڈھانچے ہوں۔
  7. میں کیسے چیک کروں کہ آیا باش میں ڈائرکٹری خالی ہے؟
  8. استعمال کریں۔ یہ تعین کرنے کے لیے کہ آیا کوئی ڈائرکٹری خالی ہے، یہ فیصلہ کرنے میں آپ کی مدد کرتا ہے کہ آیا کلون کے ساتھ آگے بڑھنا ہے یا نہیں۔
  9. RStudio میں Git آپریشنز کو خودکار کرنے کا بہترین طریقہ کیا ہے؟
  10. آٹومیشن کے لیے، اس کے ساتھ RStudio ٹرمینل میں اسکرپٹ استعمال کریں۔ یا کے ذریعے زیادہ پیچیدہ کام کے بہاؤ کے لیے۔ یہ ڈائرکٹری مینجمنٹ کو خودکار کرتے ہوئے Git کے ساتھ ہموار انضمام کو قابل بناتا ہے۔

کے ساتھ کام کرتے وقت RStudio میں، موجودہ ڈائریکٹریز کے ارد گرد کی غلطیاں مایوس کن ہو سکتی ہیں، لیکن ڈائریکٹریز کو صاف یا فلٹر کرنے کا طریقہ جاننا آپ کو ان کا مؤثر طریقے سے انتظام کرنے میں مدد کرتا ہے۔ Python، R، یا Bash میں اسکرپٹ کا فائدہ اٹھانا وقت کی بچت کر سکتا ہے، بغیر کسی رکاوٹ کے انضمام کو یقینی بناتا ہے۔

ان طریقوں کے ساتھ، خرابیوں کا سراغ لگانا آسان ہو جاتا ہے اور آپ مستقبل میں اسی طرح کے مسائل سے نمٹنے کے لیے لیس ہیں۔ اس نقطہ نظر کو اپنانا RStudio میں Git کے ساتھ ایک ہموار تجربہ کو یقینی بناتا ہے، جو آپ کو بغیر کسی رکاوٹ کے ترقی اور تعاون پر توجہ مرکوز کرنے کے لیے آزاد کرتا ہے۔ 😊

  1. ڈائرکٹری تنازعات کو مؤثر طریقے سے منظم کرنے کے عملی اقدامات کے ساتھ، RStudio میں عام Git کی غلطیوں کو حل کرنے کے بارے میں رہنمائی فراہم کرتا ہے۔ آر اسٹوڈیو سپورٹ
  2. Python's کے استعمال کی وضاحت کرتا ہے۔ اور ڈائریکٹری اور فائل مینجمنٹ کے لیے لائبریریاں، خاص طور پر اسکرپٹنگ ورک فلو میں خودکار صفائی کے لیے مفید۔ Python OS لائبریری دستاویزات
  3. تفصیلات آر اسٹوڈیو کے اندر گٹ انضمام کے لیے پیکیج، آر ماحول میں کلوننگ اور ایرر مینجمنٹ کو ہینڈل کرنے کے لیے فنکشنز پیش کرتا ہے۔ CRAN - git2r پیکیج
  4. ڈائرکٹری ہینڈلنگ اور خودکار Git آپریشنز کے لیے شیل اسکرپٹنگ تکنیکوں کے ذریعے چلتا ہے، جو مضبوط CI/CD پائپ لائنوں کو ترتیب دینے کے لیے مفید ہے۔ GNU Bash دستی