সিডি করুন স্বয়ংক্রিয়ভাবে ls


46

আমি দেখতে পাই যে আমি প্রায়শই নিম্নলিখিতগুলি করি:

%> cd bla/bla
%> ls

আমি এটি চাই যে আমি যখনই cdকোনও ডিরেক্টরিতে প্রবেশ করি এটি স্বয়ংক্রিয়ভাবে একটি হয় ls

আমি .bashrcকিছুক্ষণের জন্য আমার সাথে ঝাঁকুনি দিয়েছি , তবে কীভাবে এটি ঘটে যায় তা বুঝতে পারি না।

উত্তর:


50

আপনি একটি ফাংশন দিয়ে এটি করতে পারেন:

$ cdls() { cd "$@" && ls; }

&&মানে ' cdএকটি ডিরেক্টরি, এবং সফল (যেমন ডিরেক্টরি উপস্থিত রয়েছে) যদি, রান ls'। &&অপারেটরটি ব্যবহার করার পরে ;দুটি কমান্ডের মধ্যে সেমিকোলন অপারেটর ব্যবহার করা আরও ভাল { cd "$@" ; ls; }। এই দ্বিতীয় কমান্ডটি কাজ না lsকরে নির্বিশেষে চলবে cd। যদি cdব্যর্থ lsহয় তবে আপনার বর্তমান ডিরেক্টরিতে থাকা সামগ্রীগুলি মুদ্রণ করবে, যা ব্যবহারকারীর জন্য বিভ্রান্তিকর হবে। সেরা অনুশীলন হিসাবে, ব্যবহার করুন &&এবং না ;

$ cdls /var/log
CDIS.custom     fsck_hfs.log    monthly.out     system.log
$ pwd
/var/log

সাধারণভাবে, একটি কমান্ডের নাম পরিবর্তন করা একটি খারাপ অভ্যাস যা ইতিমধ্যে বিদ্যমান, বিশেষত একটি সাধারণ কমান্ডের মতো cd। পরিবর্তে, একটি পৃথক নাম সহ একটি নতুন কমান্ড তৈরি করুন। আপনি যদি cdএমন কোনও ফাংশন বা উপনামের নামে ওভাররাইট করে থাকেন, তবে আপনি যদি cd100,000 ফাইল সহ ডিরেক্টরিতে প্রবেশ করবেন তখন কী হবে? অনেকগুলি ইউটিলিটি রয়েছে যা ব্যবহার করে cdএবং তারা এই অস্বাভাবিক আচরণে বিভ্রান্ত হতে পারে। আপনি যদি একটি ভাগ করা অ্যাকাউন্ট ব্যবহার করেন (যেমন rootআপনি যখন অন্য সিস্টেম প্রশাসকদের সাথে কাজ করছেন), বিদ্যমান কমান্ডটি প্রতিস্থাপন করা খুব বিপজ্জনক হতে পারে কারণ পরিবেশ প্রত্যাশার চেয়ে আলাদা।


কমান্ড সত্যিই ডিরেক্টরি পরিবর্তন? ব্যাশ এর man পৃষ্ঠা থেকে: "প্রতিস্থাপন টেক্সট আর্গুমেন্ট ব্যবহার করার জন্য কোনো প্রক্রিয়া আছে যদি আর্গুমেন্ট প্রয়োজন হয়, একটি শেল ফাংশন ব্যবহার করা উচিত।"
enzotib

@ এঞ্জোটিব: হ্যাঁ, এটি আসলে আমার পক্ষে ডিরেক্টরি বদলে দেয়। এর আউটপুটটি দেখানোর জন্য আমি আমার উত্তর আপডেট করেছি pwd। এটি সর্বোত্তম অনুশীলন কিনা তা নিশ্চিত নন তবে এটি সাধারণত করা হয়। কিছু উদাহরণের জন্য tldp.org/LDP/abs/html/aliases.html দেখুন ।
স্টিফান লাসিউইস্কি

2
প্রথম: এটি এখানে কাজ করে না। দ্বিতীয়: সেই পৃষ্ঠায় তারা ভেরিয়েবল ব্যবহার করে, অবস্থানগত পরামিতিগুলি নয়। তৃতীয়: এবিএস খারাপ অভ্যাসগুলির একটি সাধারণ উত্স।
enzotib

1
উপন্যাসটি স্নো লেপার্ডে আমার জন্য কাজ করে তবে সেন্টোএস 5 বা সেন্টোস 6 এ নয়। আমি শুধুমাত্র একটি ফাংশন ব্যবহার করতে আমার উত্তর আপডেট করেছি। কোনও উপনাম নেই।
স্টিফান লাসিউস্কি

1
আমার জন্য কাজ করে না। @ ফ্রেবজুস উত্তরের চেষ্টা করেছেন এবং এটি কাজ করে: cd() { builtin cd "$@" && pwd; };- ম্যাকোজে স্ট্যান্ডার্ড বোর্ন শেল ব্যবহার করে (সিয়েরা 10.12.6)
সুইভেল

39

আমার .bashrc এ এটি আছে এবং এটি ভাল কাজ করে।

function cd {
    builtin cd "$@" && ls -F
    }

আমার .bashrc এর আগে আমার কাছে: [ -z "$PS1" ] && returnএবং এই লাইনের পরে থাকা সমস্ত কিছুই কেবল ইন্টারেক্টিভ সেশনগুলিতে প্রযোজ্য, সুতরাং এটি cdস্ক্রিপ্টগুলিতে কীভাবে আচরণ করে তা প্রভাবিত করে না ।


1
ঠিক [ -z "$PS1" ] && returnকি করে?
সিন্ট্যাগমা

2
[ -z "$PS1" ]$PS(ইন্টারেক্টিভ প্রম্পট ভেরিয়েবল) "শূন্য দৈর্ঘ্য" (-z) হয় কিনা তা পরীক্ষা করে । যদি এটি শূন্য দৈর্ঘ্য হয়, এর অর্থ এটি সেট করা হয়নি, সুতরাং বাশ অবশ্যই ইন্টারেক্টিভ মোডে চলবে না। && returnঅংশ গুন থেকে প্রস্থান করে .bashrcএমন অবস্থায়, এই সময়ে।
উদ্ভট

1
ইন্ট্যার্যাক্টিভিটির জন্য চেক করতে আরেকটি উপায় সন্ধান করা হয় iমধ্যে "$-": case "$-" in *i*) ;; *) return ;; esac
কুসালানন্দ

@ কুসালানন্দ ও উদ্ভট: এমন কি এমন কোনও ঘটনা রয়েছে যেখানে অন্যের পরিবর্তে একটি ব্যবহার করা উচিত?
সুইভেল

1
@ সুইভেল PS1ভেরিয়েবলটি আনসেট বা খালি হতে পারে এবং শেলটি এখনও ইন্টারেক্টিভ হতে পারে (তবে প্রম্পট ছাড়াই)। আমি $-নিশ্চিত করতে চেক করব।
কুসালানন্দ

13

অফ-টপিক, যেহেতু প্রশ্নটি ট্যাগ / বাশ, কিন্তু কিছু প্রশ্ন যেমন এইটির সদৃশ হিসাবে বন্ধ করা হয়েছে যা ব্যাশের উল্লেখ নেই:

Zsh সহ:

chpwd() ls

Chpwd () ফাংশনটি zsh দ্বারা ডেকে আনা হয় যখনই বর্তমান ডিরেক্টরি পরিবর্তিত হয় (সিডি, পুশড, পপডি দ্বারা ...)। tcsh এর অনুরূপ বৈশিষ্ট্য রয়েছে এবং সম্ভবত zsh এখান থেকে পেয়েছিল।


4

আপনার .bashrc ফাইলে একটি উপন্যাস যুক্ত করবেন না কেন?

কিছুটা এইরকম:

alias cdls='cd "$@" && ls'

@ don_crissti একটি মজাদার ঘটনা এবং একটি উপাধি আলাদা জিনিস। তাই কেন না?
জোডকা লেবু

ওপি যা বলেছে তা করার এটিই দ্রুত এবং পরিষ্কার উপায়। আমার মতে, ফাংশনগুলি আরও জটিল জিনিসের জন্য ব্যবহার করা উচিত, যখন প্রায়শই টাইপযুক্ত কমান্ডগুলির শর্টকাট তৈরি করা ঠিক ঠিক এর মতো এলিয়াসের জন্যই রয়েছে।
ঘোস 3 টো

আমি এই ওরফে একটি অদ্ভুত সমস্যা নিয়ে আসছি, যখন আমি এটির মতো এটি ব্যবহার করি, সিডিএলএস প্রজেক 2, এটি প্রকল্প 2 ফোল্ডারের সমস্ত ফাইল প্রদর্শন করবে তবে প্রকৃতপক্ষে সেই ফোল্ডারে সিডি নয়, পরিবর্তে এটি মূল ফোল্ডারে থাকবে।
ঘোস

2

সিডি কমান্ডের জন্য উপকরণ তৈরির সাধারণ সমাধানটি সঠিক নয় কারণ এমন অন্যান্য কমান্ড রয়েছে যা আপনার বর্তমান ডিরেক্টরিকে পপড বা এমনকি সিডি কমান্ড সহ স্ক্রিপ্ট চালাতে পারে running

Pt PROMPT_COMMAND বাশ হুক ব্যবহার করা ভাল যা কোনও প্রম্পট ফেরানোর আগে একটি আদেশ কার্যকর করে।

কমান্ডটি (আমাদের ক্ষেত্রে একটি ফাংশন) কেবলমাত্র স্ক্রিনের গোলমাল হ্রাস করতে ডিরেক্টরি পরিবর্তিত হলে ls কার্যকর করবে। .Bashrc এর জন্য কোড:

    #each console has its own file to save PWD
    PrevDir=$(tty) 
    PrevDir=/tmp/prev-dir${PrevDir////-}
    #don't ls when shell launched
    echo $PWD > $PrevDir
    LsAfterCd() {
        [[ "$(< $PrevDir)" == "$PWD" ]] && return 0

        ll --color=always | sed 1d

        echo $PWD > $PrevDir
    }
    PROMPT_COMMAND=LsAfterCd


1

বাশ-এ আপনি প্যারামিটারের প্রয়োজন হয় এমন ক্রিয়াকলাপের জন্য উপাধিতে পুনরাবৃত্তি করতে পারবেন না। এর জন্য ফাংশন রয়েছে। সুতরাং আপনার ~/.bashrcনিম্নলিখিত লিখুন

mycd() {
  cd "$1"
  ls
}


Ls কমান্ডের জন্য একটি প্যারামিটারের অনুমতি দেওয়ার জন্য, আমি mycd {বিল্টিন সিডি function 1 && ls $ 2 function ফাংশনটি ব্যবহার করি} এখন আপনি কমান্ডটি কল করতে পারেন যেমন মাইসিডি .. -লা
ক্রিশ্চিয়ান

@ChristianSchulzendorff: ভাল কোট ব্যবহার করার জন্য: function mycd { builtin cd "$1" && ls "$2" }
enzotib

কাজ করে না, আমি এটি চেষ্টা করেছিলাম। ফাইলটি খালি ছিল, তবে আপনার কোড যুক্ত করার পরে, কিছুই পরিবর্তন হয়নি।
কালো

0

প্রোফাইলে নীচের কোডটি রাখুন এবং এটি কাজ করে। এইচপি-ইউনিক্স বাক্সে পরীক্ষিত।

cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
elif [ -d "$@" ]; then
cd "$@" && ls -ltr
else
echo "$@" directory not found!!!
fi
}

#SET YOUR ALIAS TO CD
alias cd="cdl"

0

আরও সহজ - ইতিহাসে ফিরে যাওয়ার ক্ষমতা সহ :

function cd() {
    if [ -d "$@" ]; then
        echo -n "Stack: "
        pushd "$@"
        ls
    else
        builtin cd "$@"
    fi
}
function popd() {
    builtin popd "$@" && ls
}

আপনি যখন ডিরেক্টরিটি পরিবর্তন করেন এর সাথে একটি লাইন: Stack: (current_dir) (previous_dir) ...প্রদর্শিত হবে, তারপরে lsআউটপুট। Dirs ফিরে যেতে ইতিহাস শুধু এই কমান্ড পপ: popd

আমি যুক্ত করেছি elseযাতে কোনও ভুল ডিরেক্টরিতে যাওয়ার চেষ্টা করার সময় আপনি একটি ত্রুটি দেখতে পাবেন।


যদি আপনি শুধু সিডি না - এটি আপনার শেষ DIR তে আনতে যে আপনার ছিল হবে।
ইয়ান

0

আমি মনে করি যে কোনও বিকল্প গ্রহণ না lsকরায় বিকল্পগুলির বিকল্পগুলি সক্ষম করা ভাল cd

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}

উম্ম ... cdঅপশন নেয়।
Kusalananda

0

এখানে আমি দরকারী (ডিবিয়ান 9 এ) যা পাই তা এখানে:

c() {
    cd "${@}" \
    && ls --color=always -C \
    | sed '
        # on line 5, print the line,
        5 {
            # append an ellipsis
            a[...]
            # and quit
            q
        }
        # print lines 1-4 verbatim
    '
}

ডিরেক্টরিতে খুব বেশি আইটেম থাকে যাতে কনসোলটি পরিষ্কার থাকে: এটি আমাকে একটি উপবৃত্তের সাহায্যে ছাঁটাই আউটপুট দেয়:

$ c data/git/buildroot/package/
4th                              lua-markdown
a10disp                          lua-messagepack
acl                              lua-msgpack-native
acpica                           luaossl
acpid                            lua-periphery
[...]
$ ls -1 | wc --lines
1977

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.