Поведение popd и pushd с опцией "-n"

Поведение popd и pushd с опцией "-n"

Я экспериментировал с pushdbash 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нечего делать, как есть.

Связанный контент