bash - هذه - خطأ في البرنامج النصي




احصل على اسم الدليل الحالي(بدون المسار الكامل) في البرنامج النصي Bash (13)

أدناه grep مع regex يعمل أيضا ،

>pwd | grep -o "\w*-*$"

كيف يمكنني الحصول على اسم دليل العمل الحالي فقط في برنامج نصي bash ، أو حتى بشكل أفضل ، مجرد أمر طرفي.

يعطي pwd المسار الكامل لدليل العمل الحالي ، على سبيل المثال /opt/local/bin ولكن أريد فقط bin


أنا أحب الإجابة المختارة (تشارلز دافي) ، ولكن كن حذرا إذا كنت في دير ترتبط وتريد اسم dir الهدف. لسوء الحظ ، لا أعتقد أنه يمكن القيام به في تعبير توسيع معلمة واحدة ، ربما أكون مخطئًا. يجب أن يعمل هذا:

target_PWD=$(readlink -f .)
echo ${target_PWD##*/}

لرؤية هذا ، تجربة:

cd foo
ln -s . bar
echo ${PWD##*/}

تقارير "شريط"

DIRNAME

لإظهار الأدلة الرائدة لمسار (دون تكبد شوكة exec / usr / bin / dirname):

echo ${target_PWD%/*}

هذا على سبيل المثال تحويل foo / bar / baz -> foo / bar


أنا استخدم هذا الأمر:

dirname "$0"


أنا عادة ما تستخدم هذا في البرامج النصية ش

SCRIPTSRC=`readlink -f "$0" || echo "$0"`
RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`
echo "Running from ${RUN_PATH}"
...
cd ${RUN_PATH}/subfolder

يمكنك استخدام هذا لأتمتة الأشياء ...


بسيط جدا

pwd | xargs basename

سوف تؤدي الأوامر التالية إلى طباعة دليل العمل الحالي الخاص بك في برنامج نصي bash.

pushd .
CURRENT_DIR="`cd $1; pwd`"
popd
echo $CURRENT_DIR

للبحث عن الفرسان هناك مثلي:

find $PWD -maxdepth 0 -printf "%f\n"

ماذا عن grep:

pwd | grep -o '[^/]*$'

من المستغرب أن لا أحد ذكر هذا البديل الذي يستخدم أوامر bash المدمجة فقط:

i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"

كمكافأة إضافية ، يمكنك بسهولة الحصول على اسم الدليل الأصلي مع:

[ "${#p[@]}" -gt 1 ] && echo "${p[-2]}"

ستعمل هذه على Bash 4.3-alpha أو الأحدث.


هذا الموضوع رائع! وهنا نكهة واحدة أخرى:

pwd | awk -F / '{print $NF}'

يمكنك استخدام مجموعة من pwd و basename. على سبيل المثال

#!/bin/bash

CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`

echo "$BASENAME"

exit;

$ echo "${PWD##*/}"


echo "$PWD" | sed 's!.*/!!'

إذا كنت تستخدم Bourne shell أو ${PWD##*/} غير متوفر.







terminal