উত্তর:
আপনি যে আদেশটি সন্ধান করছেন তা হ'ল pushdএবং popd।
আপনি এখানেpushd এবং popdথেকে একটি বাস্তব কাজের উদাহরণ দেখতে পারেন ।
mkdir /tmp/dir1
mkdir /tmp/dir2
mkdir /tmp/dir3
mkdir /tmp/dir4
cd /tmp/dir1
pushd .
cd /tmp/dir2
pushd .
cd /tmp/dir3
pushd .
cd /tmp/dir4
pushd .
dirs
/tmp/dir4 /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1
$OLDPWDআপনি আগে পিছে একই কমান্ড ব্যবহার করে দুই ডিরেক্টরি মধ্যে টুসকি করতে চান ক্ষেত্রে, কিন্তু আমি নিশ্চিত না কিভাবে শেল-নির্দিষ্ট ও বন্টন / কার্নেল-নির্দিষ্ট এই হল আছি।
OLDPWDসব POSIX শাঁস বিদ্যমান, কিন্তু এই প্রশ্ন যা কিভাবে যে অতিক্রম করার (প্রশ্ন ইতিমধ্যে উল্লেখ জিজ্ঞেস জন্য অকাজের cd -, যার জন্য একটি শর্টকাট cd "$OLDPWD")।
cd /tmp/dir1; pushd . পরিবর্তে ব্যবহার করার কোনও কারণ আছে কি pushd /tmp/dir1?
pushd /tmp/dir1ঠিক কাজ করা উচিত।
pushdএবং popdডিরেক্টরি ডিরেক্টরিটিকে পিছনে পিছনে যেতে চাই। আপনার উত্তর ইতিমধ্যে সঠিক উত্তর।
আপনি কোন শেলটি ব্যবহার করছেন তা আপনি নির্দিষ্ট করেননি, তাই এটি zsh এর বিজ্ঞাপনের বাহানা দেওয়া হোক।
হ্যাঁ, আমাদের জন্য আরও ইতিহাস cdরয়েছে cd -2, cd -4ইত্যাদি Very খুব সুবিধাজনক cd -TAB, বিশেষত সম্পূর্ণকরণ সিস্টেম এবং রঙগুলি সক্ষম করে:
আমার কাছে .zshrc এ এটি রয়েছে:
setopt AUTO_PUSHD # pushes the old directory onto the stack
setopt PUSHD_MINUS # exchange the meanings of '+' and '-'
setopt CDABLE_VARS # expand the expression (allows 'cd -2/tmp')
autoload -U compinit && compinit # load + start completion
zstyle ':completion:*:directory-stack' list-colors '=(#b) #([0-9]#)*( *)==95=38;5;12'
এবং ফলাফল:

bashএটি একটি বৈধ উত্তর। এটি অপসারণ করবেন না।
setopt AUTO_PUSHD, উপরের সেটআপগুলির কোনওটিকেই স্টক zsh এ সম্পূর্ণ হওয়ার সাথে সর্বব্যাপী ডিরেক্টরি স্ট্যাকের প্রয়োজন নেই । এবং (স্বাদের বিষয়) PUSHD_MINUSএর অনুভূতিটি বিপরীত করে , ডিরেক্টরি স্ট্যাকের সাথে অপ্রাসঙ্গিক এবং এখানে প্রদত্ত অনুরোধটি কেবল ডিরেক্টরি স্ট্যাকের সমাপ্তির আউটপুটে রঙিন যোগ করে। একটি অবশ্যই সম্পূর্ণতা সাবসিস্টেমটি দিয়ে শুরু করতে হবে । cd +cd -CDABLE_VARSzstyleautoload -U compinit && compinit
"আরও ইতিহাস" সম্পর্কিত আপনার প্রশ্নের উত্তর দিতে। cd -বাশের কোনও বৈশিষ্ট্যই কেবলমাত্র একটি একক ডিরেক্টরিকে সমর্থন করে না যেখানে আপনি "ফ্লিপ" করতে পারেন। @ রমেশ তার উত্তরে বলেছে। আপনি যদি ডিরেক্টরিগুলির দীর্ঘতর ইতিহাস চান তবে আপনি ব্যবহার করতে পারেন pushdএবং popdডিরেক্টরিটি সংরক্ষণ করতে পারেন বা আগেরটিতে ফিরে যেতে পারেন।
dirsকমান্ডের সাহায্যে স্ট্যাকের মধ্যে বর্তমানে কী রয়েছে তার তালিকাটিও দেখতে পাবেন ।
এই উত্তর শিরোনাম থেকে একটি বিশদ ব্যাখ্যা পাওয়া যাবে: আমি কীভাবে পুশড এবং পপড কমান্ড ব্যবহার করব? ।
আপনি ব্যাশের জন্য আমার দিরহিস্টরি ইউটিলিটি ইনস্টল করতে এবং ব্যবহার করতে পারেন ।
মূলত, এটি একটি ডেমন যা আপনার সমস্ত শেল থেকে ডিরেক্টরি পরিবর্তনগুলি সংগ্রহ করে এবং একটি সিডিকে প্রোগ্রাম যা ইতিহাস প্রদর্শন করে এবং আপনাকে কোনও ডিরেক্টরি বাছাই করতে দেয় (যাতে আপনি কোনও স্ট্যাকের মধ্যে সীমাবদ্ধ নন)।
আপনার যতটা ইতিহাস রয়েছে ততটুকু রয়েছে:
cd() {
[ "$((${DIRSTACKMAX##*[!0-9]*}0/10))" -gt 0 ] &&
set -- "$@" "$DIRSTACK" &&
DIRSTACK='pwd -P >&3; command cd' ||
{ command cd "$@"; return; }
_q() while case "$1" in (*\'*) : ;; (*)
! DIRSTACK="$DIRSTACK '$2$1'" ;;esac
do set -- "${1#*\'}" "$2${1%%\'*}'\''"
done
while [ "$#" -gt 1 ]
do case ${1:---} in (-|[!-]*|-*[!0-9]*) : ;;
(*) eval " set $((${1#-}+1))"' "${'"$#}\""
eval ' set -- "$2"'" $2"'
set -- "${'"$1"'}" "$1"'
;;esac; _q "$1"; shift
done
eval " DIRSTACK=; $DIRSTACK &&"'
_q "$OLDPWD" &&
DIRSTACK=$DIRSTACK\ $1
set "$?" "${DIRSTACK:=$1}"'" $1
" 3>/dev/null
[ "$(($#-1))" -gt "$DIRSTACKMAX" ] &&
DIRSTACK="${DIRSTACK% \'/*}"
unset -f _q; return "$1"
}
এটি একটি শেল ফাংশন যা zshস্টাইল cdইতিহাসের প্রস্তাব দেওয়ার জন্য কোনও পসিক্স সুসংগত শেল সক্ষম করে । এটি একটি একক সাবশেলকে আমন্ত্রণ না করেই এর সমস্ত কাজ করে এবং আমি বিশ্বাস করি যে এর প্রবাহটি বেশ সুন্দর - এটি মাঝারি পরীক্ষার অধীনে সমস্ত ক্ষেত্রে সঠিকভাবে পরিচালনা করবে বলে মনে হয়।
ফাংশনটি পুরোপুরি পোর্টেবল সিনট্যাক্সের উপর নির্ভর করার সাথে সাথে তার পরিবেশের সাথে যত সুন্দরভাবে খেলার চেষ্টা করেছে - এটি কেবল একটি অনুমান করে এবং এটি হ'ল $DIRSTACKপরিবেশের পরিবর্তনশীল এটি যেমন ইচ্ছা তেমন করার সম্পত্তি।
এটি সমস্ত পাথকে এটি $DIRSTACKএকক উদ্ধৃতিতে সংরক্ষণ করে এবং এটির ক্রমিকায়িত করে - যদিও এটি নিশ্চিত করে যে প্রতিটিটি নিরাপদে উদ্ধৃতিযুক্ত এবং ক্রিয়াকলাপের মানটিতে যোগ করার আগে ক্রমিক করা হয়েছে এবং কোনও প্রকারের বিশেষ চরিত্রের সাথে কোনও সমস্যা নেই should । যদি $DIRSTACKMAXপরিবেশের পরিবর্তনশীলটি সেট করা থাকে তবে এটি ইতিহাসে এটি ধরে রাখার সংখ্যার জন্য উপরের সীমা হিসাবে এটি ব্যবহার করবে, অন্যথায় সীমাটি এক।
আপনি যদি ফাংশনটি cdসাধারণ হিসাবে লোড করেন তবে cd -[num]আপনার পরিবর্তনের ডিরেক্টরি ইতিহাসের মাধ্যমে ফিরে সরিয়ে নেওয়ার পক্ষেও সক্ষম হবেন ।
ফাংশনের প্রাথমিক প্রক্রিয়াটি cdনিজেই - এবং ${OLD,}PWDপরিবেশের ভেরিয়েবল। পসিক্স নির্দিষ্ট করে যে cdপ্রতিটি পাথ চলার জন্য এগুলি পরিবর্তন করে - এবং তাই এটি কেবল শেলের বিল্টিন ভেরিয়েবলগুলি ব্যবহার করে এবং যতক্ষণ আপনার পছন্দ মতো মানগুলি সংরক্ষণ করে।
Acd_func.sh স্ক্রিপ্ট ঠিক করে কি আপনি বর্ণনা করে। মূলত এটি cdফাংশনটি ওভারলোড করে এবং cd --পূর্বে পরিদর্শন করা ডিরেক্টরিগুলির একটি তালিকা পেতে টাইপ করতে সক্ষম করে , যা থেকে আপনি সংখ্যা অনুসারে নির্বাচন করতে পারেন। এগুলি ছাড়া বাশ ব্যবহার করা আমার পক্ষে খুব শক্ত find এবং আমি এটি একটি নতুন সিস্টেমে ইনস্টল করা প্রথম জিনিস।
অন্যরা ইতিমধ্যে কিছু আকর্ষণীয় সমাধান coveredেকে রেখেছে। কিছু সময় আগে আমি একটি সম্পর্কিত সমস্যার নিজস্ব সমাধান তৈরি করেছি যা দ্রুত "সরাসরি ইতিহাস" করার জন্য পরিবর্তন করা যেতে পারে। আমি মূলত কয়েকটি সাধারণভাবে ব্যবহৃত ডিরেক্টরিগুলি "লেবেল" করতে চেয়েছিলাম এবং সমস্ত খোলা শেলগুলি সেগুলি দেখতে এবং তাদের পুনরায় বুটের মধ্যে স্থির রাখতে চেয়েছিল ।
#dir_labels
#functions to load and retrieve list of dir aliases
function goto_complete {
unset dir_labels
declare -A dir_labels
{
while read line; do
ll_pre="${line%% *}"
ll_dir="${line#* }"
dir_labels["$ll_pre"]="$ll_dir"
done
} < ~/.dir_labels
unset ll_pre
unset ll_dir
local cur possib
cur="${COMP_WORDS[COMP_CWORD]}"
possib="${!dir_labels[@]}"
COMPREPLY=( $(compgen -W "${possib}" -- ${cur}) )
}
complete -F goto_complete goto
function goto {
unset dir_labels
declare -A dir_labels
{
while read line; do
ll_pre="${line%% *}"
ll_dir="${line#* }"
dir_labels["$ll_pre"]="$ll_dir"
done
} < ~/.dir_labels
unset ll_pre
unset ll_dir
if [ $# -gt 0 ]; then
key="$1"
else
key=default
fi
target="${dir_labels[$key]}"
if [ -d "$target" ]; then
cd "$target"
echo "goto $key: '$target'"
else
echo "directory '$target' does not exist"
fi
}
function label {
unset dir_labels
declare -A dir_labels
{
while read line; do
ll_pre="${line%% *}"
ll_dir="${line#* }"
dir_labels["$ll_pre"]="$ll_dir"
done
} < ~/.dir_labels
unset ll_pre
unset ll_dir
if [ $# -gt 0 ]; then
target="$1"
else
target="default"
fi
dir_labels["$target"]=$PWD
for i in "${!dir_labels[@]}"; do
echo "$i ${dir_labels[$i]}"
done > ~/.dir_labels
}
মূলত আমি শুধু করতে চাই label fooবর্তমান ডিরেক্টরী ডাকতে fooতারপর যাই হোক না কেন শেল থেকে, এবং goto foowhould cdসরাসরি নেই। খালি যুক্তি: এর labelজন্য একটি ডিফল্ট লক্ষ্য তৈরি করবে goto।
আমি উপকরণের স্বয়ংক্রিয় অপসারণ বাস্তবায়ন করতে বিরক্ত করি না, তবে অন্যথায়, আমি এখনও এটি কিছুটা পরিবর্তিত আকারে ব্যবহার করছি।
আপনি http://fex.belwue.de/fstools/bash.html থেকে আমার "সিডি ইতিহাস" ফাংশনটি ব্যবহার করতে পারেন
এটি আপনি যেখানে ছিলেন সেখানে প্রতিটি ডিরেক্টরি মনে রাখে এবং "সিডিএইচ" দিয়ে আপনি শেষ 9 ডিরেক্টরিগুলির একটি তালিকা দেখতে পাবেন। কেবল সংখ্যাটি প্রবেশ করান এবং আপনি এই ডিরেক্টরিতে ফিরে এসেছেন।
উদাহরণ:
framstag @ wupp: /: cd 1: / usr / স্থানীয় / বিন 2: / var 3: / 4: / টিএমপি / 135_পানা / 1280 5: / টিএমপি / 135_পানা 6: / টিএমপি / ওয়েইননাচস্টেফিয়ার 7: / টিএমপি 8: / স্থানীয় / হোম / ফ্রেমস্ট্যাগ নির্বাচন করুন: 4 framstag @ wupp: / tmp / '135_pana / 1280:
সিডিডি অটোকড ওরফে "সিডি বিহীন সিডি" দিয়ে কাজ করে: আপনাকে সিডি বা পুশ টাইপ করতে হবে না।
আমি আপনাকে আমার বর্ধিত 'সিডি' ফাংশনটি সুপারিশ করতে চাই:
জীবনকে সহজ করার জন্য এটি নিম্নলিখিত বৈশিষ্ট্যগুলি সরবরাহ করে:
বাশের জন্য , মূলত: pushdডিরেক্টরীগুলি পরিবর্তন করতে সিডি ব্যবহারের পরিবর্তে সেগুলি সংরক্ষণ করা হয় (অর্থাত স্তুপীকৃত)
pushd /home; pushd /var; pushd log
স্ট্যাকের ব্যবহারটি দেখতে dirsএবং সহজে নেভিগেশনের জন্য ("স্ট্যাক-এন্ট্রি" ব্যবহারের সংখ্যা পেতে:
dirs -v
আউটপুট:
me@myhost:/home$ dirs -v
0 /home
1 /var
2 /tmp
এখন এই সংখ্যাগুলি সাথে cdএবং ~মত ব্যবহার করুন :
cd ~1
তবে এখন এই সংখ্যাগুলি এখনই পুনরায় সাজানো হয়েছে এবং অবস্থান "0" পরিবর্তিত হবে, সুতরাং কেবলমাত্র pushdশীর্ষস্থানীয় ডিরেক্টরিতে ডিরেক্টরিটি দুটি বার (বা 0 অবস্থানের উপর একটি ডামি ব্যবহার করুন) যেমন:
me@myhost:/home$ dirs -v
0 /home
1 /home
2 /var
3 /tmp
এখন 1..3 সেখানে অবস্থান রাখবে আমি এটি কোথাও পড়েছি তবে আর জানি না, তাই ক্রেডিট না দেওয়ার জন্য দুঃখিত sorry
(বর্তমান ডিরেক্টরিটিকে স্ট্যাক থেকে প্রকাশ করতে / ইতিহাসের ব্যবহার থেকে মুছে ফেলা popd)
312 পৃষ্ঠায় "শেল প্রোগ্রামিং, 4 ই" তে সিডিডি ফাংশনটি দেখুন It এটি ইতিহাসকে একটি অ্যারেতে রাখে।
এখানে আরও উন্নত সংস্করণ রয়েছে: https://drive.google.com/open?id=0B4f-lR6inxQWQ1pPZVpUQ3FSZ2M
এটি সিডিআইএসটিফিল ফাইলটিতে ইতিহাস সংরক্ষণ করে এবং সর্বাধিক সাম্প্রতিক ডিরেক্টরিতে পরিবর্তনের অনুমতি দেয় যাতে স্ট্রিং রয়েছে, যেমন,
cd -src
এটি একটি বিদ্যমান সিডি কমান্ডের মাধ্যমে নিজেকে ইনস্টল করে alias cd=_cd
কেবল একটি সম্ভাব্য সমাধান হিসাবে fzf- চিহ্ন যুক্ত করতে চেয়েছিলেন ।
একবার ইনস্টল হয়ে গেলে এটি আপনাকে কমান্ড চিহ্ন দেয় এবং বুকমার্কযুক্ত ডিরেক্টরিগুলি যুক্ত করতে এবং অনুসন্ধান করতে লাফ দেয় (হ্যাঁ, এটি ঠিক সম্পূর্ণ ইতিহাস নয়, কেবল আপনি নিজেরাই বুকমার্ক করেছেন)।
পুশ / পপড দিয়ে আমার যে সমস্যাটি রয়েছে তা সেশনের নির্দিষ্ট আচরণের অর্থাত্, যেমন আমি বিভিন্ন বাশ সেশনে একই স্ট্যাক রাখতে চাই বা যা fzf- চিহ্নগুলির পক্ষে সম্ভব।
আমি @ মাইক্রোজারের দেওয়া উত্তরটি চেষ্টা করেছিলাম, তবে এটি আমার পক্ষে বেশ কার্যকর হয়নি। কীভাবে এটি ঠিক করা যায় তা আমি বুঝতে পারি না, তাই আমি কেবল নিজের লেখা:
cd() {
# Set the current directory to the 0th history item
cd_history[0]=$PWD
if [[ $1 == -h ]]; then
for i in ${!cd_history[@]}; do
echo $i: "${cd_history[$i]}"
done
return
elif [[ $1 =~ ^-[0-9]+ ]]; then
builtin cd "${cd_history[${1//-}]}" || # Remove the argument's dash
return
else
builtin cd "$@" || return # Bail if cd fails
fi
# cd_history = ["", $OLDPWD, cd_history[1:]]
cd_history=("" "$OLDPWD" "${cd_history[@]:1:${#cd_history[@]}}")
}
এটি গিটহাব গিস্ট হিসাবেও উপলব্ধ । এটি ব্যবহার করার জন্য, কেবল আপনার .bashrcবা অনুরূপটিতে ফাংশনটি cd -5আটকে দিন এবং আপনি যে 5 তম সর্বশেষ ডিরেক্টরিতে এসেছিলেন সেখানে ফিরে যাওয়ার মতো জিনিস আপনি করতে সক্ষম হবেন you আপনাকে cd -hআপনার ইতিহাসের একটি ওভারভিউ দেবে।