Как я могу предотвратить переход команды 'cd' в домашнюю директорию?

10

Дело в том, что иногда я печатаю cdпо ошибке, и это приводит меня в домашний каталог.

например, я нахожусь в каталоге, в котором есть скрытый каталог и видимый каталог, я быстро нажимаю cd+, tabи это приводит меня к домашнему каталогу

Vinicius de Novaes
источник
30
Если вы cdслучайно оказались где-то, используйте cd -для возврата к вашему предыдущему местоположению - bash сохраняет $OLDPWDпеременную для этой цели. См. Gnu.org/software/bash/manual/bash.html#index-cd
Гленн Джекман
4
Если вы действительно хотите cdничего не делать, вы можете написать функцию с именем cd, которая ничего не делает, когда аргументы не заданы, в противном случае вызовитеbuiltin cd "$@"
glenn jackman
2
Действительно плохая идея: HOME =.
Джошуа
26
Моя искренняя лучшая рекомендация - замедлиться и научиться проверять команду перед ее выполнением. Другими словами: привыкайте cdделать то, что он делает. Если у вас есть привычка выполнять команды, которые вы еще не проверили дважды, у вас возникнут гораздо большие проблемы позже. Например, вы хотите переместить два файла в третий каталог: mv a b dir/и завершение TAB не дает dirожидаемого результата, в итоге вы будете выполнять те, mv a bкоторые перезаписываются b. Научитесь быть осторожным, научитесь смотреть на команду перед нажатием Enter.
egmont
1
@Joe Я написал сценарий оболочки для rmпредотвращения стирания каталогов верхнего уровня , таких как /, /etc, /usr, /home, /varи т.д. без пароля переопределения. Иногда нам нужна защита от нас самих :)
WinEunuuchs2Unix

Ответы:

14

Используйте gedit ~/.bashrcи вставьте эти строки внизу:

cd() {
    [[ $# -eq 0 ]] && return
    builtin cd "$@"
}

Откройте новый терминал и теперь, когда вы печатаете cdбез параметров, вы просто остаетесь в том же каталоге.


TL; DR

Если вы хотите быть действительно сложным, вы можете добавить экран справки, когда параметры не переданы:

$ cd

cd: missing operand

Usage:

    cd ~            Change to home directory. Equivelent to 'cd /home/$USER'

    cd -            Change to previous directory before last 'cd' command

    cd ..           Move up one directory level

    cd ../..        Move up two directory levels

    cd ../sibling   Move up one directory level and change to sibling directory

    cd /path/to/    Change to specific directory '/path/to/' eg '/var/log'

Расширенный код для этого:

cd() {
    if [[ $# -eq 0 ]] ; then
        cat << 'EOF'

cd: missing operand

Usage:

    cd ~            Change to home directory. Equivelent to 'cd /home/$USER'

    cd -            Change to previous directory before last 'cd' command

    cd ..           Move up one directory level

    cd ../..        Move up two directory levels

    cd ../sibling   Move up one directory level and change to sibling directory

    cd /path/to/    Change to specific directory '/path/to/' eg '/var/log'

EOF
        return
    fi

    builtin cd "$@"
}
WinEunuuchs2Unix
источник
6
Но тогда вы заставили свою среду работать, как никакая другая среда. Почему бы не вызвать функцию ncd(для «New CD») и оставить реальный в cdпокое?
вальтинатор
@waltinator Я могу улучшить ответ с предупреждением о том, как cd (пусто) работает по-разному для людей, помимо домашнего пользователя ~/.bashrc. Не могли бы вы привести один или два примера, на которые стоит обратить внимание? Например, разработчик использует cd (пусто) в своем сценарии установки. (Гипотетически, но я не могу придумать случай). Я могу свернуть ваши примеры в ответ и предложить использовать ОП ncdвсе время вместо cd.
WinEunuuchs2Unix
Я люблю настраивать вещи. Это то, о чем Linux. Но у меня есть строгое личное правило никогда не менять функцию (без каламбура) каких-либо общих команд. Это открывает проблемы, когда вы работаете в другой системе или когда кто-то работает или консультирует вас по вашей. Я согласен с @waltinator и другим «хорошим» Джо
Джо
6

Если это является завершением вкладки, которое вызывает это, один вариант состоит в том, чтобы сделать цикл завершения через записи немедленно. Это можно сделать с помощью опции readlinemenu-comple вместо значения по умолчанию complete:

bind 'tab: menu-completion'

Затем в моем домашнем каталоге, например:

$ cd <tab> # becomes
$ cd .Trash

Конечно, даже тогда вам придется читать то, что вы выполняете.

Мур
источник
4

Вот как я помещаю имя текущего пользователя и пользователя в заголовок окна. Вы можете адаптировать его к своим потребностям, но cd -, эквивалентно, cd $OLDPWDэто лучшее решение.

Из моего ~/.bashrc:

# from the "xttitle(1)" man page - put info in window title
update_title()
{
    [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]]  && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD"
}

cd()
{
    [[ -z "$*" ]] && builtin cd $HOME
    [[ -n "$*" ]] && builtin cd "$*"
    update_title
}
waltinator
источник
4

Проблемы здесь нет cd, и она не решена технологией.

Проблема в тебе, и это решено терпением!

Если вам часто приходится набирать и отправлять команды, которые вам не нужны, попробуйте замедлить работу . Сделайте вдох, прочитайте, что вы печатаете, и дважды проверьте его, прежде чем нажимать ввод. Продумайте это до конца. Не торопись.

Вы обнаружите, что этот подход не только решает проблему, но и другие гораздо худшие проблемы, с которыми вы столкнетесь, если продолжите свой текущий путь.

Гонки легкости на орбите
источник
2
также после нескольких месяцев / лет использования вы забудете о том, что изменили свое поведение и у вас будут проблемы с работой в других средах.
pLumo
@RoVo Это тоже, хороший момент!
Гонки
@RoVo Это может произойти через несколько дней. Прямо сейчас, если вы используете двойную загрузку, переключитесь на виртуальную машину ...
Джо
@Joe В последнее время я переключался между OSX днем ​​и Windows вечером, и смена клавиатуры действительно сбивает с толку!
Гонки
@LightnessRacesinOrbit Я уверен! У меня две клавиатуры для ноутбуков разных размеров с почти одинаковой раскладкой, и это достаточно плохо. Вот почему я никогда не пробовал клавиатуру Dvorak. Просто не уверен, как это относится к вопросу.
Джо