Стек директорий. Снова простая вещь + дополнения

    Мало кто знает о таких командах bash как pushd и popd.
    Они позволяют работать со стеком директорий.
    pushd $DIR позволяет перейти в $DIR и добавить текущую в стек. При каждом выполнении команды стек пополняется текущей директорией.
    popd позволяет перейти к последней директории в стеке и извлечь её оттуда. Таким образом после каждого выполнения команды стек уменьшается на одну директорию, а текущая директория становится директорией на вершине стека.

    Например:
    [user@laptop ~]
    basg# cd /
    [user@laptop /]
    bash# pushd /var/log/
    /var/log /
    [user@laptop log]
    bash# pushd /usr/share/
    /usr/share /var/log /
    [user@laptop share]
    bash# popd
    /var/log /
    [user@laptop log]
    bash# popd
    /
    [user@laptop /]
    bash#



    Эта вещь крайне удобна в скриптах, когда не хватает простого «cd -» (которое, к слову, переходит к директории, которая была перед последним выполнением команды cd), а также в повседневной работе в консоли.

    Дополнения

    от CycaHuH
    > А как можно просмотреть стек?

    echo ${DIRSTACK[*]}

    ${DIRSTACK[0]} — текущая директория


    от UUSER
    `cd` переход в домашнюю директорию пользователя.
    `cd ~user` переход в домашнюю директорию другого пользователя.
    `cat /proc/cpuinfo`
    `watch !!` подставит предыдущую команду текущей.
    `!123` выполнит команду под номером из bash_history.
    `sl[ctrl+t]` поменять местами два символа.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 39

      +28
      > Мало кто знает о таких командах bash как pushd и popd

      Пользователи линукс уже не те.
        +5
        Кстати, в Windows эти команды тоже есть.
          +1
          Причем работают и для удаленных шар:
          pushd \\domain\netlogon выполнит
          net use * \\domain\netlogon (подцепим шару на свободную букву — Z:)
          pushd Z:\
        0
        А как можно просмотреть стек? Что будет, если передать команде pushd несуществующий путь?
          0
          При вызове pushd, переходя в директорию, он выводит список директорий в стеке.

          А по поводу несуществующего:
          pushd /we/e
          bash: pushd: /we/e: Нет такого файла или каталога

          просто игнорирует
            +5
            > А как можно просмотреть стек?

            echo ${DIRSTACK[*]}

            ${DIRSTACK[0]} — текущая директория
              +1
              Вот это круто! Очень удобно.
                0
                Спасибо, добавил в статью
                  0
                  Вот этого не хватало. Спасибочки.
                  +2
                  стек показывает команда dirs — ss64.com/bash/dirs.html
                  –1
                  По моему в скриптах лучше путь полностью указывать, либо относительный.
                    +10
                    По моему скрипты лучше писать, или не писать)
                    +1
                    `cd` переход в домашнюю директорию пользователя.
                    `cd ~user` переход в домашнюю директорию другого пользователя.
                    `cat /proc/cpuinfo`
                    `watch !!` подставит предыдущую команду текущей.
                    `!123` выполнит команду под номером из bash_history.
                    `sl[ctrl+t]` поменять местами два символа.
                      0
                      Спасибо, также добавил в топик
                        0
                        за ctrl+t отдельное спасибо)
                          +1
                          Сколько раз нужно нажать ctrl+t, чтобы получить слово «РОССИЯ» из «СИСЯРО»?
                          +1
                          `cd ~-` переход в предыдую директорию
                            0
                            `cd ..`
                            не?
                              0
                              не в директорию уровнем выше, а в предыдущую. Попробуйте:
                              cd /tmp
                              cd
                              cd ~-
                              pwd
                                0
                                согласен.
                              0
                              а чем отличается от просто «cd -»?
                                0
                                По всей видимости, ничем ) Работает в обоих случаях.
                                  0
                                  Если после cd ~- надать tab, то bash подставит вместо ~- полный путь. В скриптах разницы никакой.
                                    0
                                    У меня не работает.
                                0
                                в случае с`watch !!`
                                если использовать пайпы, например:
                                #$ ps ax | grep nginx
                                то работает
                                #$ watch "!!"
                                +8
                                У меня складывается ощущение что можно смело создавать блог «Маны» и туда раз в день комунибудь копипастить русский ман. Предела удивлению людей не будет :)
                                Это я не с наездом о том что топик бесполезный, я только рад, что много людей наконец-то узнало об этих командах. Это я к тому, чтобы както людям информации больше доносить, раз они читают не маны, а хабр :)
                                  +5
                                  Читая маны все не запомнишь, а во время чтения трудно понять что полезно, а что не очень. Такие топики полезны тем, что они описывают удобные возможности, о которых написано в километровых манах, но которые пропускают и не замечают.
                                    +2
                                    Рекомендую linsovet.com, там время от времени очень полезные советы проскакивают.
                                  0
                                  Спасибо, добавил в избранное. Пригодится)
                                    0
                                    Для скриптов — годится. Для повседневной работы лично мне удобнее использовать «псевдо-умную» навигацию типа z. Сама мониторит в каких папках ты работаешь чаще и по заданному фрагменту в 3-4 буквы переходит в наиболее подходящую. Сам на днях начал писать что-то подобное только полегче и на С вместо bash/awk/sed: https://bitbucket.org/trikita/2
                                      0
                                      Для скриптов на самом деле не очень годится. В чистом sh их нет, в его реализациях в виде ash/dash — соответственно, тоже нет. А тащить за собой большой и неповоротливый bash ради такого как-то обидно…
                                      +1
                                      В свое время сам интуитивно догадался о наличии pushd и popd. Они просто должны были быть :)
                                        0
                                        А как вы используете эти команды для решения своих реальных задач? Потому что, зная о их существовании, придумать этим командам применения не могу.
                                          0
                                          У меня например есть скрипт для перекидывания файлов на мой мп3шник. Он сначала в стек кидает папку откуда, потом определяет и кидает папку куда, и папку с конфигом. Таким образом я избавляюсь от 2х лишних переменных. Ну и предпочтительнее использовать pushd/popd в скриптах — очевиднее, чем «cd -» при чтении скриптов
                                            0
                                            Ну например скрипт для копирования музыки на мой mp3шник.
                                            Есть 3 директории — папка плеера, с музыкой и с настройками. И нужно сделать некоторые действия в этих 3х папках, при чем не по одному разу. Можно использовать 3 переменные, а можно так организовать стек, что достаточно будет делать pushd/popd.

                                            Вообще предпочтительнее использовать pushd/popd в скриптах, так как при чтении понятнее и очевиднее назначение push и pop, чем cd / cd —
                                              0
                                              Позволю себе не согласиться. Лично мне через год/в чужом скрипте будет понятнее команда cd $configdir чем popd. Да и (опять же, по моей логике) все пользовательские переменные (каталоги с конфигами/файлами/источники-премники) и без того определяются как переменные — для того, чтобы их можно было указать в файле конфигурации или как параметр при запуске скрипта.

                                              Тем не менее, благодарю за объяснение.

                                              P.S. Хабр проглючил — пришло на почту уведомление об ответе. Перешел на хабр, обновил коментарии — ничего. Опять пришло уведомление. Снова пришел на хабр — уже два коментария. Судя по тому, что они одинаковы по смыслу, у вас то же самое получилось.
                                                0
                                                Именно, написал комент, обновил — нету, написал заново.
                                            +1
                                            >grep push .zshrc
                                            setopt autopushd pushdminus pushdsilent pushdtohome

                                            Очень удобно.
                                              0
                                              Всех с началом недели простых вещей для линукса! :)

                                              Only users with full accounts can post comments. Log in, please.