наложение псевдонима на pushd - это хорошая идея?

35

Это хорошая идея, чтобы использовать следующий псевдоним:

cd() {
    pushd $1;
}

в баш?

Я думаю, что это было бы очень полезно, так как тогда я могу использовать серию popds вместо cd -одного.

Есть ли случай, когда это может быть проблемой?

Lazer
источник
2
Я знаю, в Zsh есть настройка, чтобы сделать это. Не уверен, что это все же. Нужно ли делать функцию вместо просто alias cd=pushd?
Фальмарри
2
Я бы присвоил псевдоним функции.
Алесплин
1
Почему бы вместо псевдонима новое имя. Как насчет pd? Вы единственный пользователь и администратор вашей системы?
Кевин Канту
3
@Falmarri Zsh вариантautopushd
Майкл Мрозек
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будет перемещаться между текущим и предыдущим каталогами, не выталкивая их из стека каталогов. В целом, это прекрасно работает.

Единственная реальная проблема, о которой я знаю, это то, что это набор команд, к которым я полностью привык, но не существует на чужой машине. Так что, если мне придется использовать чужую машину, это может немного расстроить. Если вы привыкли просто использовать pushdи popdнапрямую, у вас нет этой проблемы. И в то время , если вы просто псевдоним cdставить не popd, вы не будете иметь проблемы backне существует, вы по- прежнему есть проблема , что cdне делает совсем то , что вы ожидаете на других машинах.

Я хотел бы отметить, однако, что ваша конкретная реализация cdне совсем работает так, как cdесли бы нормаль cdсама по себе попадет в ваш домашний каталог, а ваша - нет. Версия, которая у меня есть, не имеет этой проблемы. Мое также добавляется DIRSTACKк передней части dirsраспечатки, но это больше вопрос личного вкуса, чем чего-либо еще.

Итак, как я уже сказал, я использую эти псевдонимы все время и не имею проблем с ними. Просто может быть немного неприятно использовать другую машину, а потом найти их там (что не должно удивлять, но это одна из тех вещей, которую вы используете так часто, что не думаете о них) таким образом, если они не работают так, как вы привыкли, это может удивить).

Джонатан М Дэвис
источник
Отличный совет! Пользователи Vi / Vimperator можно настроить , <C-o>чтобы popdдля подлинного опыта.
unperson325680
1
@progo, можешь ли ты объяснить, как flip изменит каталог с выталкиванием из стека каталогов?
Джонатан.
Привыкнув к конфигам zsh, этого не хватает: (1) дедупликация элементов в dirstack и (2) способы просто перейти непосредственно к элементу в dirstack с его индексом. Я думаю, что могу легко написать оболочки для их реализации ... К сожалению, похоже, что DIRSTACK в bash не разрешено изменять, поэтому, возможно, просто придется остаться.
Стивен Лу
Можете ли вы добавить ясно, чтобы очистить dirs?
Пасупати Раджаманикам
7

Это не прямой ответ на вопрос, но я влюбился в окно истории каталогов в 4DOS. Настолько, что я написал свою собственную версию для Linux (и Cygwin). Я никогда не удосужился сделать его легким в установке утилита, но если вы знаете свой путь вокруг Bash подсказку, это не должно быть , что трудно получить работу. Ваш вопрос вдохновил меня поместить его в репозиторий Git и загрузить на GitHub: dirhistory .

По сути, это демон, который собирает изменения каталогов со всех ваших оболочек, и программа Cdk, которая отображает историю и позволяет вам выбрать любой каталог для переключения (так что вы не ограничены стеком). Я нахожу это действительно полезным, и привязал его к Ctrl-PageUp, как это сделал 4DOS. (Я даже исправил PuTTY, чтобы он посылал Ctrl-PageUp в Bash.)

CJM
источник
0

Для меня pushd / popd / dirs близок к полезному, но отсутствует. Поэтому я создал «обертку» вокруг них, называемую «navd», реализованную как набор из 20 псевдонимов. (На самом деле одна из них - функция.) Код приведен ниже, но сначала приведем краткое объяснение. (Одна приятная вещь о «navd» и работе на чужих машинах: есть форма «no-install» для его запуска: в качестве одного из вариантов установки вы можете просто вставить команды, которые реализуют «navd», в командной строке bash и во время этой bash-сессии для этой машины будет работать 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, считая от ПРАВА, с индексированием, начинающимся с -1. (Это следует соглашению о том, как индексы массива могут использоваться в Java и других языках.)

Примечание. Любая команда «navd» отображает тот же стек, который используют «pushd» и «dirs», но отображает его БЕЗ самой левой записи, которую отображает «dirs» (поскольку эта запись в действительности не находится в стеке - она текущий каталог и «dirs» изменяют крайнюю левую запись, если введена команда cd). (Команда "cd <path>" не влияет на поведение navd, хотя она, безусловно, влияет на поведение pushd / dirs / popd. Также ... Мне нравится использовать "cd -", чтобы вернуться "назад" один раз к директория, с которой я только что ушел, и cd - также не влияет на поведение navd.)

Бонус: может быть еще 19 псевдонимов, которые НЕ вращают стек, а просто меняют dir на место, указанное в стеке.

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

2-й бонус: «navh» показывает команды navd <path> из истории, для легкой загрузки стека с помощью cut-n-paste. (Каждый из них указан только один раз, даже если он находится в истории несколько раз, а список отсортирован. Кроме того, записи могут быть помещены в файл $ HOME / .navhignore, чтобы эти точные записи не появлялись в списке навигации).

 navh

Три ключевых поведения:

  1. Если вы очистите стек и повторите определенную команду «navd <путь>», этот путь будет идти в стеке. Это то, что я хочу и ожидаю ... но pushd этого не делает - он помещает текущий стек, которым вы пользуетесь, ОТКРЫТЬСЯ в стек - так что эффект в стеке является переменным (кажется непредсказуемым), когда вы повторяете команду ,

  2. «navd <путь>» не будет помещать один и тот же путь в стек дважды.

  3. «navd <путь>» помещает себя в историю команд с абсолютным путем, даже если для команды был введен относительный путь.

Для меня последние три описанных поведения делают использование команды «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
Дана, у тебя две разные учетные записи с одинаковым именем. Вы можете объединить их довольно легко.
Ройма
Вы раскручиваете Perl-интерпретатор каждый раз, когда меняете каталог? Нет, спасибо.
Трипп Кинетикс
0

Вот еще одно решение, которое вам может понравиться. Я написал это после игры с решением @cjm. Он использует команду dialog для создания меню типа ncurses из вывода dirs. Выбор элемента приведет к тому, что этот каталог окажется на вершине стека и перейдет в него. Это имеет преимущество перед dirhistory: каждый эмулятор терминала имеет свой собственный буфер истории каталогов, и его немного проще установить.

Для установки: После того, как вы установили псевдоним cd для pushd, установите диалоговое окно, а затем просто добавьте эту функцию в ваш 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, а затем запускать другую команду для pop или cd в каталог, который я хочу. Диалоговое меню также может быть настроено с помощью своего диалогового окна.

Поэтому, чтобы ответить на ваш вопрос, да, я думаю, что псевдоним pushd для cd - отличная идея. У вас вряд ли будут проблемы с переполнением буфера, если вы регулярно перезагружаете свой компьютер хотя бы для обновления. Хотя я бы с осторожностью использовал cd при написании скриптов; cd в цикле while может вызвать проблемы переполнения буфера. Я не уверен, что контролирует размер буфера dirs / pushd.

Overdr0ne
источник