تمرير الحجة إلى الاسم المستعار في باش [مكررة

StackOverflow https://stackoverflow.com/questions/4060880

  •  27-09-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

هل من الممكن القيام بما يلي:

أريد تشغيل ما يلي:

mongodb bin/mongod

في بلدي bash_profile لدي

alias = "./path/to/mongodb/$1"
هل كانت مفيدة؟

المحلول

سيتوسع الاسم المستعار إلى السلسلة التي يمثلها. أي شيء بعد الاسم المستعار سيظهر بعد توسعه دون الحاجة إلى أن يكون أو قادرًا على تمريره كوسيطات صريحة (على سبيل المثال $1).

$ alias foo='/path/to/bar'
$ foo some args

سوف يتم توسيعها إلى

$ /path/to/bar some args

إذا كنت ترغب في استخدام الوسائط الصريحة ، فستحتاج إلى استخدام وظيفة

$ foo () { /path/to/bar "$@" fixed args; }
$ foo abc 123

سيتم تنفيذها كما لو كنت قد فعلت

$ /path/to/bar abc 123 fixed args

لإلغاء تحديد الاسم المستعار:

unalias foo

لإلغاء تحديد وظيفة:

unset -f foo

للاطلاع على النوع والتعريف (لكل اسم مستعار محدد أو كلمة رئيسية أو دالة أو ملف مدمج أو قابل للتنفيذ):

type -a foo

أو اكتب فقط (لأعلى أسبقية حدوث):

type -t foo

نصائح أخرى

عادة عندما أرغب في نقل الحجج إلى الاسم المستعار في باش ، أستخدم مزيجًا من الاسم المستعار ودالة مثل هذا ، على سبيل المثال:

function __t2d {                                                                
         if [ "$1x" != 'x' ]; then                                              
            date -d "@$1"                                                       
         fi                                                                     
} 

alias t2d='__t2d'                                                               

لاستخدام المعلمات في الاسم المستعار ، أستخدم هذه الطريقة:

alias myalias='function __myalias() { echo "Hello $*"; unset -f __myalias; }; __myalias'

إنها وظيفة مدمرة ذاتية ملفوفة في الاسم المستعار ، لذلك فهي أفضل ما في العالمين ، ولا تأخذ خطًا إضافيًا في تعريفاتك ... وهو ما أكرهه ، أوه نعم ، وإذا كنت بحاجة إلى ذلك. القيمة ، يجب عليك تخزينها قبل استدعاء unset ، ثم إرجاع القيمة باستخدام الكلمة الرئيسية "إرجاع" في هذه الوظيفة المدمرة الذاتي هناك:

alias myalias='function __myalias() { echo "Hello $*"; myresult=$?; unset -f __myalias; return $myresult; }; __myalias'

لذا..

يمكنك ، إذا كنت بحاجة إلى هذا المتغير هناك

alias mongodb='function __mongodb() { ./path/to/mongodb/$1; unset -f __mongodb; }; __mongodb'

بالطبع...

alias mongodb='./path/to/mongodb/'

في الواقع ، سيفعل الشيء نفسه دون الحاجة إلى المعلمات ، ولكن كما قلت ، إذا كنت تريد أو كنت بحاجة إليها لسبب ما (على سبيل المثال ، كنت بحاجة إلى دولارين بدلاً من دولار واحد) ، ستحتاج إلى استخدام غلاف من هذا القبيل. إذا كان أكبر من سطر واحد ، فقد تفكر في كتابة وظيفة مباشرة لأنها ستصبح أكثر من قِبل Eyesore لأنها تزداد. تعد الوظائف رائعة نظرًا لأنك تحصل على جميع الامتيازات التي تمنحها الوظائف (انظر الإكمال ، الفخاخ ، الربط ، وما إلى ذلك للأشياء الجيدة التي يمكن أن توفرها ، في MinPage Bash).

اتمنى ان يساعدك هذا للخروج :)

هذا هو الحل الذي يمكن أن يتجنب استخدام الوظيفة:

alias addone='{ num=$(cat -); echo "input: $num"; echo "result:$(($num+1))"; }<<<'

نتيجة الاختبار

addone 200
input: 200
result:201

في CSH (في مقابل سحق) يمكنك أن تفعل بالضبط ما تريد.

alias print 'lpr \!^ -Pps5'
print memo.txt

التدوين \!^ يؤدي إلى إدراج الوسيطة في الأمر في هذه المرحلة.

ال ! الشخصية مسبقة من قبل أ \ لمنع تفسيرها على أنها أمر تاريخ.

يمكنك أيضًا تمرير وسيطات متعددة:

alias print 'lpr \!* -Pps5'
print part1.ps glossary.ps figure.ps

(أمثلة مأخوذة من http://unixhelp.ed.ac.uk/shell/alias_csh2.1.html .)

لتبسيط إجابة LEED25D ، استخدم مزيجًا من الاسم المستعار والوظيفة. فمثلا:

function __GetIt {
    cp ./path/to/stuff/$* .
}

alias GetIt='__GetIt'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top