aliasing cd to pushd - เป็นความคิดที่ดีหรือไม่?


35

ควรใช้นามแฝงต่อไปนี้หรือไม่:

cd() {
    pushd $1;
}

ในทุบตี?

ฉันคิดว่ามันจะมีประโยชน์มากเพราะฉันสามารถใช้ชุดข้อมูลpopdแทนที่จะเป็นเพียงcd -ครั้งเดียว

มีกรณีใดบ้างที่สิ่งนี้อาจเป็นปัญหาหรือไม่?


2
ฉันรู้ใน zsh มีการตั้งค่าให้ทำเช่นนี้ ไม่แน่ใจว่ามันคืออะไร จำเป็นหรือไม่ที่จะต้องทำฟังก์ชั่นแทนที่จะเป็นเพียงแค่alias cd=pushd?
Falmarri

2
ฉันต้องการนามแฝงของฟังก์ชัน
alesplin

1
ทำไมไม่ใช้นามแฝงชื่อใหม่แทน แล้วไงpdล่ะ คุณเป็นผู้ใช้และผู้ดูแลระบบของคุณหรือไม่?
Kevin Cantu

3
@Falmarri ตัวเลือก zsh คือautopushd
Michael Mrozek

1
พูดอย่างเคร่งครัดนั่นคือฟังก์ชั่นไม่ใช่นามแฝง (แต่ดีกว่าทั้งหมด)
tripleee

คำตอบ:


39

ส่วนตัวฉันมีสิ่งเหล่านี้ใน bashrc ของฉันและใช้พวกเขาตลอดเวลา:

pushd()
{
  if [ $# -eq 0 ]; then
    DIR="${HOME}"
  else
    DIR="$1"
  fi

  builtin pushd "${DIR}" > /dev/null
  echo -n "DIRSTACK: "
  dirs
}

pushd_builtin()
{
  builtin pushd > /dev/null
  echo -n "DIRSTACK: "
  dirs
}

popd()
{
  builtin popd > /dev/null
  echo -n "DIRSTACK: "
  dirs
}

alias cd='pushd'
alias back='popd'
alias flip='pushd_builtin'

จากนั้นคุณสามารถนำทางไปรอบ ๆ บนบรรทัดคำสั่งเล็กน้อยเช่นเบราว์เซอร์ cdเปลี่ยนไดเรกทอรี backไปที่ไดเรกทอรีก่อนหน้าซึ่งคุณcdแก้ไข และflipจะย้ายระหว่างไดเรกทอรีปัจจุบันและก่อนหน้าโดยไม่ต้อง popping จากไดเรกทอรีกอง โดยรวมแล้วมันใช้งานได้ดี

ปัญหาจริงเพียงอย่างเดียวที่ฉันรู้คือความจริงที่ว่ามันเป็นชุดคำสั่งที่ฉันคุ้นเคยอย่างสมบูรณ์ แต่ไม่มีอยู่ในเครื่องของคนอื่น ดังนั้นถ้าฉันต้องใช้เครื่องของคนอื่นมันอาจจะหงุดหงิดนิดหน่อย หากคุณคุ้นเคยกับการใช้pushdและpopdโดยตรงคุณไม่มีปัญหานั้น และแม้ว่าคุณcdจะไม่ใส่นามแฝงpopdแต่คุณจะไม่มีปัญหาในการbackไม่มีอยู่คุณจะยังคงมีปัญหาที่cdไม่ได้ทำสิ่งที่คุณคาดหวังในเครื่องอื่น ๆ

อย่างไรก็ตามฉันทราบว่าการใช้งานเฉพาะของคุณcdไม่ได้ผลเหมือนcdปกติcdโดยตัวของมันเองจะไปที่โฮมไดเร็กตอรี่ของคุณ แต่ของคุณไม่ได้ รุ่นที่ฉันมีที่นี่ไม่มีปัญหานั้น ฉันยังผนวกDIRSTACKเข้ากับด้านหน้าของdirsงานพิมพ์ แต่นั่นเป็นเรื่องของรสนิยมส่วนตัวมากกว่าอะไร

ดังที่ฉันพูดฉันใช้นามแฝงเหล่านี้ตลอดเวลาและไม่มีปัญหากับพวกเขา เป็นเพียงแค่ว่ามันน่าหงุดหงิดนิดหน่อยที่จะต้องใช้เครื่องอื่นแล้วหามันไม่ได้อยู่ที่นั่น (ซึ่งไม่น่าแปลกใจ แต่พวกมันเป็นหนึ่งในสิ่งที่คุณใช้บ่อยจนคุณไม่คิดถึงพวกมัน ดังนั้นการทำให้มันไม่ทำงานเหมือนที่คุณคุ้นเคย


คำแนะนำที่ยอดเยี่ยม! ผู้ใช้ Vi / Vimperator สามารถกำหนดค่าเป็น<C-o>เพื่อpopdประสบการณ์การใช้งานที่แท้จริง
unperson325680

1
@progo คุณสามารถอธิบายวิธีพลิกจะเปลี่ยนไดเรกทอรีด้วยการ popping จากไดเรกทอรีกอง
โจนาธาน

เมื่อได้ใช้ zsh configs แล้วสิ่งนี้จะหายไป: (1) การทำรายการซ้ำซ้อนใน dirstack และ (2) วิธีในการเพียง cd ไปยังรายการโดยตรงในดัชนีของ บริษัท ฉันคิดว่าฉันสามารถเขียนโปรแกรมเสริมเพื่อนำไปใช้งานได้อย่างง่ายดาย ... โชคไม่ดีที่ปรากฏว่า DIRSTACK ของ bash นั้นไม่ได้รับอนุญาตให้แก้ไขดังนั้นจึงต้องมีการใช้งานซ้ำ
Steven Lu

คุณช่วยเพิ่มชัดเจนเพื่อล้าง dirs?
Pasupathi Rajamanickam

7

นี่ไม่ใช่คำตอบที่ตรงกับคำถาม แต่ฉันตกหลุมรักกับหน้าต่างประวัติไดเรกทอรีใน 4DOS มากเสียจนฉันเขียนเวอร์ชันของตัวเองสำหรับ Linux (และ Cygwin) ฉันไม่เคยอากาศรอบ ๆ เพื่อทำให้มันง่ายต่อการติดตั้งสาธารณูปโภค แต่ถ้าคุณรู้ทางของรอบทุบตีพร้อมท์ก็ไม่ควรที่ยากที่จะได้ทำงาน คำถามของคุณเป็นแรงบันดาลใจให้ฉันไปใส่ลงใน repo Git และอัปโหลดไป GitHub: dirhistory

โดยทั่วไปแล้วมันเป็นดีมอนที่รวบรวมการเปลี่ยนแปลงไดเรกทอรีจากเชลล์ทั้งหมดของคุณและโปรแกรม Cdk ที่แสดงประวัติและช่วยให้คุณเลือกไดเรกทอรีใด ๆ เพื่อสลับไปที่ (ดังนั้นคุณจึงไม่ จำกัด สแต็ก) ฉันคิดว่ามันมีประโยชน์จริงๆและผูกไว้กับ Ctrl-PageUp เช่นเดียวกับ 4DOS (ฉันยังแก้ไข PuTTY ด้วยดังนั้นมันจะส่ง Ctrl-PageUp ไปที่ Bash)


0

สำหรับฉัน pushd / popd / dirs นั้นใกล้เคียงกับเป็นประโยชน์ แต่ขาดไป ดังนั้นฉันจึงสร้าง 'wrapper' รอบ ๆ สิ่งเหล่านี้เรียกว่า 'navd' ซึ่งมีการใช้งานเป็นชุดของนามแฝง 20 รายการ (หนึ่งในนั้นคือฟังก์ชั่นจริงๆ) รหัสอยู่ด้านล่าง แต่นี่เป็นคำอธิบายสั้น ๆ ก่อน (สิ่งหนึ่งที่ดีเกี่ยวกับ "navd" และการทำงานบนเครื่องของผู้อื่น: มีรูปแบบ "ไม่ติดตั้ง" ของการใช้งาน: เป็นตัวเลือกการติดตั้งหนึ่งคุณสามารถวางในคำสั่งที่ใช้ "navd" ที่ bash-prompt และสำหรับระยะเวลาของ bash-session สำหรับเครื่อง navd นั้นจะทำงานได้ซึ่งจะให้การพิมพ์แบบไม่มีศูนย์ในระบบไฟล์ แต่เป็นการติดตั้งชั่วคราวใส่คำสั่งเหล่านั้นใน. bashrc สำหรับการติดตั้ง "ของจริง" ของ แน่นอน.)

คุณสมบัติ:

navd <path>;   -- will make that path the current dir AND will add it to the stack
                         AS A BONUS: If a relative path is used, this command is added to history
                         with an absolute path instead. This improves navigation even when only
                         using history ... because very often relative-path commands in history
                         are useless if the command changes the current directory. (After all, you
                         would have to be in the directory the command was originally issued
                         from in order for such a command to work correctly.)
navd           -- shows the stack, with index numbers for convenience
navd0          -- makes the first entry on the stack (read left-to-right) **the current dir**
navd1          -- makes the second entry on the stack (read left-to-right) **the current dir**
.
.
.
navd9          -- makes the tenth entry on the stack (read left-to-right) **the current dir**
navd-1         -- makes the first entry on the stack WHEN READ RIGHT-to-LEFT(!) **the current dir**
.                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
.
.
navd-9         -- makes the 9th entry on the stack WHEN READ RIGHT-to-LEFT(!) **the current dir**

ใด ๆ ของเก้า navd <N> คำสั่งหมุนสแต็คเพื่อให้ไดเรกทอรีที่จะกลายเป็นผบปัจจุบันยังตอนนี้การแสดงที่ด้านหน้าของสแต็ค ค่า <N> เชิงบวกจะค้นหาจำนวน dir นับจากด้านซ้ายโดยการทำดัชนีเริ่มต้นที่ศูนย์ ค่าลบ <N> ค้นหาจำนวน dir นับจาก RIGHT โดยการทำดัชนีเริ่มต้นที่ -1 (สิ่งนี้เป็นไปตามหลักการของวิธีการใช้ดัชนีอาเรย์ในภาษาจาวาและภาษาอื่น ๆ )

หมายเหตุ: คำสั่ง "navd" ใด ๆ จะแสดงสแต็กเดียวกันกับที่ "pushd" และ "dirs" ใช้ - แต่แสดงโดยไม่มีรายการ ซ้ายสุดที่ "dirs" จะแสดง (เนื่องจากรายการนั้นไม่ได้อยู่ในสแต็กจริง ๆ ) ไดเรกทอรีปัจจุบัน และด้วย "dirs" ที่รายการด้านซ้ายสุดจะเปลี่ยนแปลงหากป้อนคำสั่ง cd) (คำสั่ง "cd <path>" ไม่ส่งผลต่อพฤติกรรมใด ๆ ของ navd แต่แน่นอนว่าจะส่งผลต่อพฤติกรรมของ pushd / dirs / popd นอกจากนี้ ... ฉันชอบที่จะใช้ "cd -" เพื่อไป "ย้อนกลับ" หนึ่งครั้งเพื่อ ไดเรกทอรีที่ฉันเพิ่งนำทางออกไปและ "cd -" ไม่ส่งผลกระทบต่อพฤติกรรมของ navd เช่นกัน)

โบนัส: สามารถมีนามแฝงได้อีก 19 รายการซึ่งไม่หมุนสแต็ก แต่เพียงเปลี่ยน dir เป็นสถานที่ที่ระบุไว้ในสแต็ก

 nav0 ... nav9   and   nav-1  ... nav-9

โบนัสที่สอง: "navh" แสดงคำสั่ง navd <path> จากประวัติเพื่อให้โหลดสแต็กได้ง่ายขึ้นด้วย cut-n-paste (แต่ละรายการจะถูกแสดงเพียงครั้งเดียวแม้ว่าจะอยู่ในประวัติศาสตร์หลายครั้งและมีการจัดเรียงรายการนอกจากนี้ยังสามารถใส่รายการในไฟล์ $ HOME / .navhignore เพื่อป้องกันรายการที่แน่นอนเหล่านั้นไม่ให้ปรากฏในรายการ navh)

 navh

พฤติกรรมที่สำคัญสามประการ:

  1. หากคุณล้างสแต็กและทำซ้ำคำสั่ง "navd <path>" เฉพาะเส้นทางนั้นจะไปที่สแต็ก นั่นคือสิ่งที่ฉันต้องการและคาดหวัง ... แต่ pushd ไม่ทำเช่นนั้น - มันทำให้ dir ปัจจุบันที่คุณนำทางไปจาก FROM บนสแต็ก - ดังนั้นผลกระทบของสแต็กคือตัวแปร (รู้สึกไม่แน่นอน) เมื่อคุณทำซ้ำคำสั่ง .

  2. "navd <path>" จะไม่ใส่เส้นทางเดียวกันบนสแต็กสองครั้ง

  3. "navd <path>" ใส่ตัวเองลงในประวัติคำสั่งด้วยเส้นทางที่แน่นอนแม้ว่าเส้นทางสัมพัทธ์ถูกพิมพ์ลงในคำสั่ง

สำหรับฉันพฤติกรรมสามอย่างสุดท้ายที่อธิบายไว้ใช้คำสั่ง "navd <path>" จากประวัติมีประโยชน์มากกว่าการใช้ "pushd <path>" จากประวัติ ฉันสามารถใช้ประวัติศาสตร์อีกครั้งเพื่อไปสถานที่ต่าง ๆ และเมื่อฉันทำเช่นนั้นฉันจะไม่ "ทำลาย" กองซ้อนของฉัน

หากคุณสามารถและต้องการห่อสมองของคุณไปรอบ ๆ มันคุณสามารถสลับไปมาระหว่างการใช้ navd และ pushd / dirs / popd ทั้งสองใช้กองซ้อนเดียวกัน เพียงแค่มีสไตล์ที่แตกต่าง ตัวอย่างเช่นใช้ "popd" เพื่อลบสิ่งต่าง ๆ จากสแต็ก "navd" หรือใช้ "dirs -c" เพื่อล้างสแต็ก navd

คิดว่า pushd / dirs / popd เป็น "ฉันจะย้อนขั้นตอนของฉันได้อย่างไร"
คิดว่า navd เป็น "ฉันจะยึดมั่นในชุดของไดเรกทอรีที่ชื่นชอบและสลับไปมาได้อย่างง่ายดาย?"

วางสิ่งต่อไปนี้ลงในหน้าต่างเทอร์มินัลและคุณสามารถเริ่มใช้ navd ได้ทันทีในช่วงเวลาของเทอร์มินัลเซสชันนั้น นี่คือรหัสทั้งหมดที่มีต่อคุณสมบัตินี้

# Add 1 function and many related aliases for something like "pushd", called "navd". http://unix.stackexchange.com/a/229161
# Think of pushd/dirs/popd as "how do I retrace my steps?".
# Think of navd as "how do I hold on to a set of favorite directories, and easily switch between them?".
# Pseudo-code to explain each part of the "navd" bash function just below:
#              If no arguments to the 'navd' command:
#                  If stack has entries, then print the stack one-line-per-dir with each line numbered.
#                  Else, if stack is empty, automatically run the equivalent of the navh command.
#              Else (there **are** arguments to the 'navd' command):
#                  If arg is '--help' or '/?' then show help.
#                  Else    (arg is assumed to be a path to a directory)
#                      Remember the directory we are starting at
#                      Change to dir given as argument (the "arg-dir"), and do a few chores:
#                      Do not use arg-dir literally ... instead, magically put the **absolute** path we arrived at into history.
#                      Set a flag if the arg-dir is already in the stack.
#                      If the flag is set then just show the stack (on one line), else ADD to stack, ROTATE to end-of-stack, and show the stack.
#                      Change to dir we started at and then back to the arg-dir. This allows "cd -" to go back to dir we started at.
#                  End-If
#              End-If
navd () {
    if [[ $1 == '' ]]; then                             #--no arguments to the 'navd' command
        if dirs +1 >/dev/null 2>&1; then                #------stack has entries
            dirs -p | perl -ne 'print (-1+$cn++); print "$_"' | grep -v "^-1";
        else                                            #------stack is empty
            echo "The navd stack is empty. Now running 'navh' in case that's helpful. navd --help works."
            if [[ ! -f $HOME/.navhignore ]]; then echo -n ''>>$HOME/.navhignore;fi;diff --new-line-format="" --unchanged-line-format="" <(history | perl -ne "if (m/^\s*\d+\s+navd [\"~.\/]/) {s/^\s*\d+\s+/  /;s/\/$//;print}" | sort -u) <(cat $HOME/.navhignore | sort -u);echo "cat $HOME/.navhignore # (Has "`grep -c . <(sort -u $HOME/.navhignore)`" unique lines.)"
        fi
    else                                                #--(there **are** arguments to the 'navd' command)
        if [[ $1 == '--help' || $1 == '/?' ]]; then     #------arg is '--help' or '/?'
            echo "The 'navd' functionality is nothing but one bash function and a set of aliases."
            echo "It offers a different style of handy directory navigation than pushd/popd."
            echo "It uses the same 'stack' as pushd. Look in the .bashrc file for details."
            echo "    (Think of pushd/dirs/popd as 'how do I retrace my steps?'."
            echo "     Think of navd as 'how do I remember a set of favorite directories,"
            echo "     and easily switch between them?'.)"
            echo "As of 10/2015, this link has more info: http://unix.stackexchange.com/a/229161"
            echo "Here is the set of navd-related aliases. None need any parameter:"
            alias | grep 'alias nav' | cut -d= -f1 | grep -v '-' | grep -v 'navh'
            alias | grep 'alias nav' | cut -d= -f1 | grep '-'
            echo "alias navh  # The 'navh' alias has nothing to display until a 'navd <path>' is run. Short for nav-history."
            echo "---- To get started, simpy type navd followed by your favorite path. ----"
            echo "---- navd with no param shows stack. nav0 navigates to first on stack. ----"
        else                                            #------(arg is assumed to be a path to a directory)
            mypwd="$PWD"
            cd "$1" >/dev/null;
            history -s `echo "$PWD" | perl -pe 's/$ENV{'HOME'}/~/;s/ /\\\\ /g;s/^/navd /'`
            myflag=`dirs -p | perl -pe 's/\n/:/' | perl -ne '@a=split(":");$pwd=shift(@a);$flag=0;foreach (@a) {if ($_ eq $pwd) {$flag=1}};print $flag'`
            if [[ $myflag == 1 ]]; then dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"; else pushd .>/dev/null; pushd +1>/dev/null; dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"; fi
            cd "$mypwd"; cd "`dirs -l -0`"
        fi
    fi
};
# Aliases for navigating and rotating the "pushd" stack in the style of "navd":
alias navd0='cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"' # "-l" is dash-L, and expands "~" to denote the home dir. Needed inside back-ticks.
alias navd1='cd "`dirs -l +1`";pushd -n +1;cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd2='myd=$PWD;cd "`dirs -l +1`";for i in {1..2};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd3='myd=$PWD;cd "`dirs -l +1`";for i in {1..3};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd4='myd=$PWD;cd "`dirs -l +1`";for i in {1..4};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd5='myd=$PWD;cd "`dirs -l +1`";for i in {1..5};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd6='myd=$PWD;cd "`dirs -l +1`";for i in {1..6};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd7='myd=$PWD;cd "`dirs -l +1`";for i in {1..7};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd8='myd=$PWD;cd "`dirs -l +1`";for i in {1..8};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd9='myd=$PWD;cd "`dirs -l +1`";for i in {1..9};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-1='cd "`dirs -l -0`";pushd -n -0>/dev/null; dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-2='myd=$PWD;cd "`dirs -l -0`";pushd -n -0>/dev/null;cd "`dirs -l -0`";pushd -n -0>/dev/null;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-3='myd=$PWD;cd "`dirs -l -0`";for i in {1..3};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-4='myd=$PWD;cd "`dirs -l -0`";for i in {1..4};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-5='myd=$PWD;cd "`dirs -l -0`";for i in {1..5};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-6='myd=$PWD;cd "`dirs -l -0`";for i in {1..6};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-7='myd=$PWD;cd "`dirs -l -0`";for i in {1..7};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-8='myd=$PWD;cd "`dirs -l -0`";for i in {1..8};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-9='myd=$PWD;cd "`dirs -l -0`";for i in {1..9};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
# BONUS commands (beyond the 20). Aliases for navigating but NOT rotating the "navd" stack:
#      Help in remembering: "navd<#>" does more since it both changes the PWD and rotates the stack, whereas "nav<#>" does less
#            (and has one letter less) since "nav<#>" only changes the PWD. Also "navd<#>" acts like the pushd-related command: dirs
#      There is no "nav" command (with no number) so that there will be no conflict if any program called "nav" is used.
alias nav0='cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav1='cd "`dirs -l +2`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav2='cd "`dirs -l +3`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav3='cd "`dirs -l +4`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav4='cd "`dirs -l +5`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav5='cd "`dirs -l +6`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav6='cd "`dirs -l +7`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav7='cd "`dirs -l +8`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav8='cd "`dirs -l +9`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav9='cd "`dirs -l +10`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-1='cd "`dirs -l -0`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-2='cd "`dirs -l -1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-3='cd "`dirs -l -2`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-4='cd "`dirs -l -3`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-5='cd "`dirs -l -4`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-6='cd "`dirs -l -5`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-7='cd "`dirs -l -6`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-8='cd "`dirs -l -7`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-9='cd "`dirs -l -8`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
# BONUS command (beyond the 20). Alias for showing 'history' of all navd commands that add to the stack.
#                Can be used in a new terminal session to quickly add recently used dirs to the navd stack.
alias navh='if [[ ! -f $HOME/.navhignore ]]; then echo -n ''>>$HOME/.navhignore;fi;diff --new-line-format="" --unchanged-line-format="" <(history | perl -ne "if (m/^\s*\d+\s+navd [\"~.\/]/) {s/^\s*\d+\s+/  /;s/\/$//;print}" | sort -u) <(cat $HOME/.navhignore | sort -u);echo "cat $HOME/.navhignore # (Has "`grep -c . <(sort -u $HOME/.navhignore)`" unique lines.)"'
# Note: When 'navd <relative-path>' is used, then by bash-magic the navd command puts 'navd <absolute-path>' into history,
#       instead. This allows the output of "navh" to be useful regardless of the directory that is current when it is run.
#
# BONUS commands (beyond the 20). An even shorter alias for navd. An even shorter alias for navh.
alias nd='navd'
alias nh='if [[ ! -f $HOME/.navhignore ]]; then echo -n "">>$HOME/.navhignore;fi;diff --new-line-format="" --unchanged-line-format="" <(history | perl -ne "if (m/^\s*\d+\s+navd [\"~.\/]/) {s/^\s*\d+\s+/  /;s/\/$//;print}" | sort -u) <(cat $HOME/.navhignore | sort -u);echo "cat $HOME/.navhignore # (Has "`grep -c . <(sort -u $HOME/.navhignore)`" unique lines.)"'

นามแฝงเหล่านี้ใช้คำสั่ง "bash" ใช้ความระมัดระวังเป็นพิเศษเพื่อรักษาพฤติกรรมปกติของ "cd -" (บ่อยครั้งที่ฉันใช้ "cd -" แทนที่จะรบกวนด้วย pushd หรือ navd - เพราะ "cd -" มีประโยชน์มากสำหรับการกลับไปยัง "สถานที่" สุดท้ายที่คุณอยู่หรือสลับไปมาระหว่าง 2 แห่งและ มันทำงานได้ทุกที่โดยไม่มีการติดตั้ง)

แน่นอนว่าคำสั่งเหล่านี้สามารถใส่ลงในไฟล์. bashrc เพื่อการติดตั้งที่ถาวรยิ่งขึ้น


1
ดูเหมือนว่าคุณมีบัญชีสองบัญชีแยกกันที่มีชื่อเดียวกัน คุณสามารถรวมมันได้อย่างง่ายดาย
roaima

คุณหมุนล่าม perl ทุกครั้งที่คุณเปลี่ยนไดเรกทอรีหรือไม่ ไม่เป็นไรขอบคุณ.
Tripp Kinetics

0

นี่คือโซลูชันอื่นที่คุณอาจชอบ ฉันเขียนสิ่งนี้หลังจากเล่นกับวิธีแก้ปัญหาโดย @cjm มันใช้คำสั่งโต้ตอบเพื่อสร้างเมนูประเภท ncurses จากการส่งออกของ dirs การเลือกรายการจะนำไดเรกทอรีนั้นไปไว้ด้านบนสุดของสแต็กและซีดี สิ่งนี้มีประโยชน์มากกว่า dirhistory ในการให้แต่ละเทอร์มินัลอีมูเลเตอร์จำลองบัฟเฟอร์ของตัวเองของประวัติไดเรกทอรีและติดตั้งได้ง่ายขึ้นเล็กน้อย

วิธีการติดตั้ง: เมื่อคุณได้สร้างนามแฝงเป็น cd ถึง pushd แล้วให้ติดตั้งกล่องโต้ตอบจากนั้นใส่ funtion นี้ใน bashrc ของคุณ:

dirmenu(){
    dirIter=$(dialog --backtitle 'dirmenu' --clear --cancel-label "Exit" --menu "Please select:" 0 0 0 $(dirs) 3>&2 2>&1 1>&3)
    cmd="builtin cd ~$dirIter"
    eval $cmd
}

ฉันชอบสิ่งนี้ดีกว่าการเรียกใช้ dirs -v จากนั้นใช้คำสั่งอื่นเพื่อป๊อปหรือซีดีไปยังไดเรกทอรีที่ฉันต้องการ เมนูโต้ตอบยังสามารถปรับแต่งได้อย่างสูงผ่าน dialogrc ของมัน

ดังนั้นเพื่อตอบคำถามของคุณใช่ฉันคิดว่า aliasing pushd to cd เป็นความคิดที่ดี คุณไม่น่าจะมีปัญหาบัฟเฟอร์ล้นหากคุณรีบูตเครื่องเป็นประจำอย่างน้อยสำหรับการปรับปรุง แม้ว่าฉันจะใช้ซีดีอย่างระมัดระวังในการเขียนสคริปต์ cd ในขณะที่ลูปอาจทำให้เกิดปัญหาบัฟเฟอร์ล้น ฉันไม่แน่ใจว่าสิ่งที่ควบคุมขนาดบัฟเฟอร์ dirs / pushd

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.