Самый простой способ - использовать функцию оболочки:
mkcd() {
mkdir -p -- "$1" && cd -- "$1"
}
Поместите его в свой файл .bashrc
чтобы сделать его доступным вам, как и другую команду оболочки.
Причина, по которой он не работает как внешний скрипт, заключается в том, что cd
изменяет текущий каталог запущенного скрипта, но не влияет на вызывающий. Это по замыслу! Каждый процесс имеет свой собственный рабочий каталог, который наследуется его дочерними элементами, но обратное невозможно.
Если только часть конвейера не запущена в фоновом режиме или явно в подоболочке, функция оболочки запускается не в отдельном процессе, а в том же самом, как если бы команда была получена. Текущая оболочка каталога может быть изменена функцией.
Используемый здесь &&
для разделения обеих используемых команд означает, что, если первая команда выполнена успешно (mkdir
), запустите вторую (cd
). Следовательно, если mkdir
не удается создать запрошенный каталог, нет смысла пытаться зайти в него. Сообщение об ошибке печатается mkdir
и это все .
Параметр -p
используемый с mkdir
позволяет этой утилите создать любой отсутствующий каталог, который является частью полного пути имени каталога, переданного в качестве аргумента. Одним из побочных эффектов является то, что если вы попросите создать уже существующий каталог, функция mkcd
не будет работать, и вы окажетесь в этом каталоге. Это может рассматриваться как проблема или особенность. В первом случае функция может быть изменена, например, таким способом, который просто предупреждает пользователя:
mkcd() {
if [ -d "$1" ]; then
printf "mkcd: warning, \"%s\" already exists\n" "$1"
else
mkdir -p "$1"
fi && cd "$1"
}
Без опции -p
поведение исходной функции было бы совсем другим.
Если каталог, содержащий каталог для создания, еще не существует, mkdir
завершается ошибкой, так же как и функция.
Если каталог для создания уже существует, mkdir
тоже не работает и cd
не вызывается.
Наконец, обратите внимание, что установка / экспорт PWD
имеет смысла, так как оболочка уже делает это внутренне.
Редактировать: я добавил опцию --
в обе команды для функции, чтобы имя каталога начиналось с тире.