Похож svnadmin
двоичный файл является просто слоем кода, который переносит общую библиотеку, чтобы сделать фактическую работу (включая номер версии). Действительно, если я работаю strings $(which svnadmin)
, сообщение версии не появляется в выводе, таким образом, это не часть svnadmin
двоичный файл.
Так, различие в LD_LIBRARY_PATH между Вашей интерактивной сессией и cron
могло объяснить различие в поведении.
Можно использовать что-то вроде этого:
push() {
if [ "$1" = . ]; then
old=$OLDPWD
current=$PWD
builtin pushd .
cd "$old"
cd "$current"
else
builtin pushd "$1"
fi
}
Если Вы называете его pushd
, затем это будет иметь приоритет по встроенному, поскольку функции оценены, прежде чем создано-ins.
Вам нужны переменные old
и current
как перезапись OLDPWD
заставит его потерять свое особое значение.
Немного более краткая версия ответа Wojtek:
pushd () {
if [ "$1" = . ]; then
cd -
builtin pushd -
else
builtin pushd "$1"
fi
}
Путем именования функции pushd
, можно использовать pushd
как нормальные, Вы не должны помнить использовать имя функции.
Ответ Кевина отличный. Я написал некоторые подробности о том, что происходит, на тот случай, если люди хотят лучше понять, почему их сценарий необходим для решения проблемы.
Причина, по которой 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 -
потерял свою полезную историю и теперь просто переместит вас в текущий каталог - ничего не достигнув.
cd
изменение $OLDPWD, следовательно источник проблемы. Я назвал бы функцию сохраненной и использовал бы ее в контексте, который Вы любите также, то из сохранения cwd. – bsd 21.02.2012, 14:53old
иcurrent
после того, как Вы сделаны с ними. – Wildcard 30.03.2016, 02:08