سؤال Bash: Spaces في الاسم المستعار


أحاول إنشاء أسماء مستعارة في bash. ما أريد القيام به هو الخريطة ls -la إلى ls -la | more

في ملفي .bashrc هذا ما حاولت القيام به:

alias 'ls -la'='ls -la | more'

ومع ذلك فإنه لا يعمل لأن (أفترض) أنه يحتوي على مسافات في الاسم المستعار. هل هناك عمل حول هذا؟


98
2018-02-05 22:35


الأصل


لماذا لا تفعل alias lsm='ls -la | more' - Nifle


الأجوبة:


ال وثائق باش تنص على أنه "بالنسبة إلى كل الأغراض تقريبًا ، يُفضل استخدام وظائف shell على الأسماء المستعارة". هنا هي وظيفة قذيفة التي تحل محل ls ويؤدي الإخراج إلى piped إلى more إذا كانت الحجة تتكون من (فقط) -la.

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

كواحد بطانة:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

إخراج الأنبوب تلقائيًا:

ls -la

104
2018-02-05 23:13



لماذا تحتاج إلى استخدام الأقواس المزدوجة داخل بيان if؟ - sixtyfootersdude
sixtyfootersdude: شكل القوس المزدوج أقوى وأستخدمه عادة. نرى mywiki.wooledge.org/BashFAQ/031 - Dennis Williamson
إذن ما هو الأمر النهائي؟ الاسم المستعار ls = 'ls ()' ؟؟ - Jeef
Jeef: لا ، إجابتي تستخدم وظيفة في حين أن من الاسم المستعار. لقد قمت بتحريره في محاولة لجعله أكثر وضوحا. - Dennis Williamson
merlinpatt: command يمنع الدالة من استدعاء متكرر. - Dennis Williamson


من صفحة الاسم المستعار الرجل:

الكلمة الأولى لكل أمر بسيط ،   إذا غير مدرجة ، يتم التحقق لمعرفة ما إذا كان   لديه اسم مستعار. إذا كان الأمر كذلك ، فإن هذه الكلمة هي   استبدال نص الاسم المستعار. ال   الاسم المستعار والنص البديل   قد يحتوي على أي إدخال شل صالح ،   بما في ذلك الحروف الأولية قذيفة ، مع   الاستثناء الذي قد الاسم المستعار   لا تحتوي على `= '.

لذلك ، يتم التحقق من الكلمة الأولى فقط للمطابقة الاسمية التي تجعل الأسماء المستعارة متعددة الكلمات مستحيلة. قد تكون قادرًا على كتابة نص برمجي من نوع shell يقوم بالتحقق من الوسيطات ويستدعي الأمر إذا كان يتطابق مع ما هو عادي أو غير ذلك ls (نرى @ رد دينيس ويليامسون)


45
2018-02-05 22:47



+1 لتوضيح سبب عدم السماح لي باستخدام ls -la كاسم مستعار. - sixtyfootersdude
كان هذا مفيدا لأنه بدلا من محاولة حلها أجاب على السؤال. لقد جئت إلى هنا لأنني أردت إنشاء اسم مستعار يحتوي على مساحة فيه ولن يحدث ذلك. - angryundead


نهج محسّن قليلاً مأخوذ من إجابة دنيس:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

أو أحادي الخطوط:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

هذا يسمح لمزيد من الخيارات / الحجج ليتم إلحاقها بعد الأمر إذا لزم الأمر ، على سبيل المثال ls -la -h


13
2017-09-26 12:42



كيف هذا التعامل إذا كنت تريد ls -lat يستبعد من هذا العلاج؟ كنت بحاجة لوضع قضية للتعامل معها فوق -la* دخول ، نعم؟ - Steven Lu


يمكنك استدعاء هذا الاسم المستعار لا يزال ، ولكنك تحتاج إلى اقتباس لكي تكون المساحة جزءًا من كلمة الأمر. وبالتالي "ls -la" -p pattern سوف تمر -p pattern خيار ل more، ليس ls.


-2
2018-02-05 23:34