উত্তর:
আপনি যে আদেশটি সন্ধান করছেন তা হ'ল 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_VARS
zstyle
autoload -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 foo
whould 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
আপনার ইতিহাসের একটি ওভারভিউ দেবে।