Конфликт между 'pushd'. и 'CD -'

Похож svnadmin двоичный файл является просто слоем кода, который переносит общую библиотеку, чтобы сделать фактическую работу (включая номер версии). Действительно, если я работаю strings $(which svnadmin), сообщение версии не появляется в выводе, таким образом, это не часть svnadmin двоичный файл.

Так, различие в LD_LIBRARY_PATH между Вашей интерактивной сессией и cron могло объяснить различие в поведении.

5
21.02.2012, 14:07
3 ответа

Можно использовать что-то вроде этого:

push() { 
    if [ "$1" = . ]; then
        old=$OLDPWD
        current=$PWD
        builtin pushd .
        cd "$old"
        cd "$current"
    else
        builtin pushd "$1"
    fi
}

Если Вы называете его pushd, затем это будет иметь приоритет по встроенному, поскольку функции оценены, прежде чем создано-ins.

Вам нужны переменные old и current как перезапись OLDPWD заставит его потерять свое особое значение.

7
27.01.2020, 20:35
  • 1
    Это работает отлично на меня. Нет ли во встроенном pushd никакая такая функция? Поскольку я всегда предпочитал бы стандартное решение. Спасибо за эту функцию однако, возможно, я не учту аргумент, и это проверяет в какой-то момент. –  Bernhard 21.02.2012, 14:41
  • 2
    Во встроенном нет такой функции. Ваша собственная функция является лучшим решением потому что pushd и popd оба вызова cd изменение $OLDPWD, следовательно источник проблемы. Я назвал бы функцию сохраненной и использовал бы ее в контексте, который Вы любите также, то из сохранения cwd. –  bsd 21.02.2012, 14:53
  • 3
    Вы могли бы также хотеть сбросить old и current после того, как Вы сделаны с ними. –  Wildcard 30.03.2016, 02:08

Немного более краткая версия ответа Wojtek:

pushd () {
        if [ "$1" = . ]; then
                cd -
                builtin pushd -
        else    
                builtin pushd "$1"
        fi      
}

Путем именования функции pushd, можно использовать pushd как нормальные, Вы не должны помнить использовать имя функции.

3
27.01.2020, 20:35

Ответ Кевина отличный. Я написал некоторые подробности о том, что происходит, на тот случай, если люди хотят лучше понять, почему их сценарий необходим для решения проблемы.

Причина, по которой pushd. нарушает поведение cd - станет очевидным, если мы углубимся в работу cd и стека каталогов. Давайте поместим несколько каталогов в стек:

$ mkdir dir1 dir2 dir3
$ pushd dir1
~/dir1 ~
$ pushd../dir2
~/dir2 ~/dir1 ~
$ pushd../dir3
~/dir3 ~/dir2 ~/dir1 ~
$ dirs -v
0       ~/dir3
1       ~/dir2
2       ~/dir1
3       ~

Теперь мы можем попробовать cd - , чтобы вернуться к каталогу:

$ cd -
/home/username/dir2
$ dirs -v
0       ~/dir2
1       ~/dir2
2       ~/dir1
3       ~

Мы видим, что cd - переместил нас обратно в предыдущий каталог, заменив stack ~ 0 на каталог, в который мы перешли. Мы можем вернуться назад с помощью cd - снова:

$ cd -
/home/username/dir3
$ dirs -v
0       ~/dir3
1       ~/dir2
2       ~/dir1
3       ~

Обратите внимание, что мы перешли обратно в наш предыдущий каталог, даже если предыдущий каталог фактически не был указан в стеке каталогов. Это потому, что cd использует переменную среды $ OLDPWD для отслеживания предыдущего каталога:

$ echo $OLDPWD
/home/username/dir2 

Если мы сделаем pushd. мы поместим дополнительную копию текущего каталога в стек:

$ pushd . 
~/dir3 ~/dir3 ~/dir2 ~/dir1 ~
$ dirs -v
0       ~/dir3
1       ~/dir3
2       ~/dir2
3       ~/dir1
4       ~

В дополнение к созданию дополнительной копии текущего каталога в стеке, pushd. обновил $ OLDPWD :

$echo $OLDPWD
/home/username/dir3

Итак, cd - потерял свою полезную историю и теперь просто переместит вас в текущий каталог - ничего не достигнув.

0
27.01.2020, 20:35

Теги

Похожие вопросы