
Я экспериментировал с pushd
bash popd
(Cygwin, на странице руководства написано «GNU bash 4.1»), и, похоже, поведение на странице руководства не совсем соответствует действительности.
Для pushd
, команда
% pushd +1
оба вращают стек и меняют рабочий каталог;
% pushd -n +1
просто вращает стек. Кажется, это соответствует странице руководства.
Но
% popd +1
удаляет запись из стека, но НЕ изменяет рабочий каталог (даже если "-n" не был указан). Это, похоже, не соответствует странице руководства, процитированной ниже:
Аргументы, если они указаны, имеют следующие значения:-н Подавляет обычное изменение каталога при удалении каталогов из стека, так что манипулируется только стек.
+н Удаляетнth запись, считая слева от списка, показанного
dirs
, начиная с нуля. Например: «popd +0
» удаляет первый каталог, «popd +1
» — второй.
Так ли это должно быть?
решение1
Я сейчас экспериментирую с popd/pushd и думаю, что так и должно быть. Логика в том, что это -n
подавляет смену каталогаеслиего следовало бы сделать без -n
.
popd +N
с N
не равным нулю не изменяет каталог. Он только удаляет элемент из стека. Так что в этой ситуации -n
ничего не должен делать, потому что у него нет изменений для подавления.
Напротив, если вы используете popd -n
или popd -n +0
, то удаляется второй верхний элемент стека, а не тот, что на самом верху. Потому что если вы удалите верхний, ваш каталог изменится. Я имею в виду, если у вас есть:
0 ~/one/two/three
1 ~/one/two
2 ~/one
3 ~
когда вы делаете popd +0
или popd
без-n
Ваш текущий каталог изменится на ~/one/two, а стек каталогов теперь будет выглядеть так:
1 ~/one/two
2 ~/one
3 ~
Так что -n
следует подавлять это поведение. И таким образом, если,вместовы запускаете popd -n +0
или popd -n
вы все еще находитесь в своем старом каталоге и стек dirs теперь такой:
0 ~/one/two/three
1 ~/one
2 ~
Вы можете видеть, что был удален второй верхний элемент ~/one/two, а не самый верхний (чтобы вы могли остаться в старом каталоге).
Итак, я пытаюсь подчеркнуть здесь, что вершина вашего стека dirs всегда является вашим текущим каталогом. И -n
должна предотвратить изменение каталога. Поэтому -n
должна предотвратить изменение вершины стека. Но если вершина стека не изменена, флагу -n
нечего делать, как есть.