जवाबों:
आप जिस कमांड को देख रहे हैं वह है 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
आदि बहुत सुविधाजनक है 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
और उन सभी को सिंगल-कोट्स पर क्रमबद्ध करते हैं - हालांकि यह सुनिश्चित करता है कि प्रत्येक को सुरक्षित रूप से उद्धृत किया जाए और इसे वैरिएबल के मूल्य में जोड़ने से पहले क्रमबद्ध किया जाए और किसी भी प्रकार के किसी भी विशेष वर्ण के साथ कोई समस्या नहीं होनी चाहिए। । यदि $DIRSTACKMAX
पर्यावरण चर सेट किया जाता है तो यह इतिहास में इसे बनाए रखने वाले पथों की संख्या के लिए ऊपरी सीमा के रूप में उपयोग करेगा, अन्यथा सीमा एक है।
यदि आप फ़ंक्शन cd
को सामान्य रूप से लोड करते हैं, लेकिन cd -[num]
अपने परिवर्तन निर्देशिका इतिहास के माध्यम से वापस वापस करने के लिए भी कर पाएंगे ।
फ़ंक्शन का प्राथमिक तंत्र cd
स्वयं है - और ${OLD,}PWD
पर्यावरण चर। POSIX निर्दिष्ट करता है कि cd
ये हर पथ चाल के लिए बदलते हैं - और इसलिए यह केवल शेल के बिल्ट चर का उपयोग करता है और जब तक आप चाहें तब तक मानों को बचाता है।
Acd_func.sh स्क्रिप्ट में केवल करता है कि तुम क्या वर्णन। अनिवार्य रूप से यह cd
फ़ंक्शन को ओवरलोड करता है और आपको cd --
पहले से देखी गई निर्देशिकाओं की एक सूची प्राप्त करने के लिए टाइप करने में सक्षम करता है , जिसमें से आप संख्या द्वारा चयन कर सकते हैं। मुझे अब इसके बिना बैश का उपयोग करना बहुत मुश्किल है, और इसकी पहली चीज जो मैं एक नई प्रणाली पर स्थापित करता हूं।
दूसरों ने पहले से ही कुछ दिलचस्प समाधानों को कवर किया। कुछ समय पहले मैंने एक संबंधित समस्या के लिए अपना समाधान बनाया था जिसे "सीधे इतिहास" करने के लिए जल्दी से संशोधित किया जा सकता था। मैं मूल रूप से कुछ प्रयुक्त निर्देशिकाओं को "लेबल" करना चाहता था, और चाहता था कि सभी खुले गोले उन्हें देखें, और उनके लिए विद्रोहियों के बीच बने रहें।
#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 से मेरे "सीडी इतिहास" फ़ंक्शन का उपयोग कर सकते हैं
यह हर उस निर्देशिका को याद करता है जहाँ आप रहे हैं और "cdh" के साथ आपको अंतिम 9 निर्देशिकाओं की एक सूची दिखाई देगी। बस संख्या दर्ज करें और आप इस निर्देशिका में वापस आ गए हैं।
उदाहरण:
framstag @ wupp: /: CDH 1: / usr / स्थानीय / बिन 2: / var 3: / 4: / tmp / 135_pana / 1280 5: / tmp / 135_pana 6: / tmp / weihnachtsfeier 7: / tmp 8: / स्थानीय / घर / फ्रैमस्टाग चयन करें: ४ framstag @ wupp: / tmp / 135_pana / 1280:
सीडीएच ऑटोकैड उर्फ "सीडी के बिना सीडी" के साथ काम करता है: आपको सीडी या पुशड टाइप करने की आवश्यकता नहीं है।
मैं आपको अपनी विस्तारित 'सीडी' फ़ंक्शन की सिफारिश करना चाहता हूं:
यह जीवन को आसान बनाने के लिए निम्नलिखित सुविधाएँ प्रदान करता है:
के लिए पार्टी , मूल रूप से: बजाय सीडी उपयोग का उपयोग करने के pushd
लिए, परिवर्तन directorys ताकि वे सहेजे जाते हैं (खड़ी अर्थ)
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 वहां स्थिति रखेगा कि मैंने इसे कहीं पढ़ा, लेकिन अब और नहीं जानता, इसलिए श्रेय नहीं देने के लिए खेद है
(वर्तमान निर्देशिका को स्टैक से जारी करने के लिए / इतिहास के उपयोग से हटाने के लिए popd
)
पृष्ठ 312 पर "शेल प्रोग्रामिंग, 4e" में सीडीएच फ़ंक्शन देखें। यह इतिहास को एक सरणी में रखता है।
यहाँ एक और अधिक उन्नत संस्करण है: https://drive.google.com/open?id=0B4f-lR6inxQWQ1pPZVpUQ3FSZ2M
यह फ़ाइल CDHISTFILE में इतिहास संग्रहीत करता है और सबसे हाल की निर्देशिका में बदलने की अनुमति देता है जिसमें एक स्ट्रिंग, जैसे,
cd -src
यह खुद को मौजूदा सीडी कमांड पर स्थापित करता है a alias cd=_cd
बस संभव समाधान के रूप में fzf- निशान जोड़ना चाहते थे ।
एक बार स्थापित होने के बाद यह आपको कमांड मार्क करता है और बुकमार्क की गई निर्देशिकाओं को जोड़ने और खोजने के लिए कूदता है (हां, यह पूरी तरह से पूरा इतिहास नहीं है, केवल वही हैं जो आपने खुद को बुकमार्क किया था)।
समस्या मुझे पुशड / पॉपड के साथ है यह विशिष्ट व्यवहार सत्र है, यानी मैं अलग-अलग बैश सत्र पर एक ही स्टैक करना चाहूंगा या जो fzf- निशान के लिए संभव है।
मैंने जवाब दिया @mikeserv ने कोशिश की, लेकिन यह मेरे लिए बहुत काम नहीं आया। मैं यह पता नहीं लगा सका कि इसे कैसे ठीक किया जाए, इसलिए मैंने सिर्फ अपना लिखा:
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[@]}}")
}
यह GitHub Gist के रूप में भी उपलब्ध है । इसका उपयोग करने के लिए, फ़ंक्शन को अपने .bashrc
या समान में पेस्ट करें , और आप उन चीजों को करने में सक्षम होंगे जो आपके द्वारा किए गए cd -5
5 वें अंतिम निर्देशिका में वापस cd -h
जाएंगे, आपको अपने इतिहास का अवलोकन देंगे।