Возможно, использование "набора" является неподходящим?
Да, существует Ваша проблема.
set
не делает то, что Вы могли бы ожидать. Из документации:Это встроенное так сложно, что это заслуживает своего собственного раздела.
set
позволяет Вам изменять значения опций оболочки и устанавливать позиционные параметры или отображать имена и значения переменных оболочки.Отметьте заметное отсутствие "на самом деле переменных оболочки набора" в том списке вещей, которые это делает. Проложенный под землей во всех документах, Вы найдете, что то, что это делает, устанавливает позиционные параметры оболочки на аргументы, которые Вы дали. Вы просто даете один аргумент, весь из
MONGODB="/usr/local/mongodb/bin"
. Так$1
установлен на это (и$#
установлен на 1, так как существует только один аргумент).Выиграть один за антимнемонические названия команды Unix, ха?
Так так или иначе попробуйте просто:
MONGODB=/usr/local/mongodb/bin export PATH=${PATH}:${MONGODB}
и это будет работать.
Эта команда работает как sort|uniq
, но удерживает строки на месте
nl|sort -k 2|uniq -f 1|sort -n|cut -f 2
В основном, предварительно ожидает к каждой строке его число. После sort|uniq
- луг, все строки отсортированы назад согласно их первоначальному заказу (использующий поле номера строки), и поле номера строки удалено из строк.
Это решение имеет дефект, что это не определено, какой представитель класса равных строк сделает его в выводе, и поэтому его положение в окончательном результате не определено. Однако, если последний представитель должен быть выбран, Вы можете sort
вход вторым ключом:
nl|sort -k2 -k 1,1nr|uniq -f1|sort -n|cut -f2
Для перечитывания и обратной записи истории, можно использовать history -a
и history -w
соответственно.
Найденный этим решением в дикой природе и протестированный:
awk '!x[$0]++'
В первый раз, когда определенное значение строки (0$) замечено, значение x [0$] является нулем.
Значение нуля инвертируется с !
и становится тем.
Оператор, который оценивает, каждый вызывает действие по умолчанию, которое является печатью.
Поэтому в первый раз определенное $0
замечен, это печатается.
В каждый следующий раз (повторения) значение x[$0]
был incrented,
его отрицаемое значение является нулем, и оператор, который оценивает для обнуления, не печатает.
Для хранения последнего повторного значения инвертируйте историю и используйте тот же awk:
awk '!x[$0]++' ~/.bash_history # keep the first value repeated.
tac ~/.bash_history | awk '!x[$0]++' | tac # keep the last.
Они сохранили бы последние дублированные строки:
ruby -i -e 'puts readlines.reverse.uniq.reverse' ~/.bash_history
tac ~/.bash_history | awk '!a[$0]++' | tac > t; mv t ~/.bash_history
Удлинение Clayton Ответ:
tac $HISTFILE | awk '!x[$0]++' | tac | sponge $HISTFILE
TAC
Образование файла, убедитесь, что вы установили TORETILS
, так что у вас есть губку
Используйте TEMP-файл.
Итак, я искал то же самое после того, как меня раздражали дубликаты, и обнаружил, что если я отредактирую свой ~ / .bash_profile (Mac) с помощью:
export HISTCONTROL=ignoreboth:erasedups
Он делает именно то, что вы хотели, он сохраняет только самую последнюю команду. ignoreboth
на самом деле аналогичен выполнению ignorespace: ignoredups
, и это вместе с erasedups
выполняет свою работу.
По крайней мере, на моем Mac-терминале с bash эта работа отлично работает. Нашел здесь, на askubuntu.com .
Однозначно записывать каждую новую команду сложно. Сначала нужно добавить в ~/.profile
или аналогичный:
HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'
Затем нужно добавить к~/.bash_logout
:
history -a
history -w
sort
,-r
переключитесь всегда инвертирует порядок сортировки. Но это не приведет к результату, который Вы имеете в виду.sort
расценивает два случаевls
как идентичный, так что в итоге, даже когда инвертировано, возможный порядок зависит от алгоритма сортировки. Но посмотрите мое обновление для другой идеи. – artistoex 20.09.2012, 22:29nl
в начале каждой строки кода? Не был должен это бытьhistory
? – A.L 04.02.2015, 11:50