Есть ли ярлык на mkdir foo и сразу в него записаться?


89

Это то, что я делаю часто

$ mkdir foo
$ cd foo

Это работает как одна команда, но это больше нажатий клавиш и не экономит время.

$ mkdir foo && cd foo

Есть ли ярлык для этого?

редактировать

С помощью приведенной ниже справки это кажется самым элегантным ответом.

# ~/.bashrc
function mkcd {
  if [ ! -n "$1" ]; then
    echo "Enter a directory name"
  elif [ -d $1 ]; then
    echo "\`$1' already exists"
  else
    mkdir $1 && cd $1
  fi
}

1
Вы можете переименовать функцию, mkdirесли используете ее, command mkdir $1а не только mkdir $1в теле функции.
Энди

2
(1) почему бы не просто "mkdir $ 1; cd $ 1" вместо "&&"? таким образом, "cd" завершается успешно, даже если "mkdir" завершается неудачно, и вам не нужны леса "делает это уже существует". (2) как написано, ваша функция не будет работать (чтобы запросить у вас имя каталога). Вы должны поместить это в отдельное предложение «if» из теста существования (в настоящее время в «elif»).
Квик-кихот

Ответы:


45

Я не эксперт по Linux / Bash, но попробуйте добавить это в свой .bashrc.

function mkdir
{
  command mkdir $1 && cd $1
}

PS Спасибо Деннису за использование command mkdir.


2
Вместо того `which mkdir`, чтобы просто использовать command mkdir.
Деннис Уильямсон

1
Спасибо Деннис. Там нет ничего под man command- вы могли бы направить меня к ссылке? (Я могу понять, что он делает, но стоит быть внимательным;)
Энди

2
commandописано в руководстве пользователяbash (которое является встроенным; это не отдельная команда). Вы также можете попробовать help command.
grawity

Это также работает для Zsh кстати
Флориан Лох

94

В bash, zshРаковины

Если вы не хотите, чтобы другая функция запоминалась и не возражали против ошибок:

$ mkdir /home/foo/doc/bar && cd $_

$_(Доллары подчеркивание) переменная команда Баша содержит самый последний параметр. Таким образом, если пользователь введет следующее в командной строке:, echo foo bar && echo $_ bazто результат будет следующим:

foo bar
bar baz

fishShell

В раковине рыбы я бы напечатал следующее:

> mkdir / home / foo / doc / bar
> CD alt + ↑

Клавиша alt в сочетании с клавишей со стрелкой вверх или вниз переключает историю параметров команды.


4
Это zshтоже работает .
Набиль Кадими,

3
Можете ли вы объяснить, что такое $ _? Новичок здесь.
arg20

@NabilKadimi Вы имели в виду, что <kbd> Alt <kbd> + <kbd> ⬆ <kbd> хорошо работает в Zsh? На самом деле, с zsh 5.4.2 и on-my-zsh, Alt + ⬆ дает мне символ 'A'.
Выходные

+1 за $ _ - Глупая сексуальная Фландрия!
cig0

22

Для пользователей oh-my-zsh :
$ take 'directory_name'

Ссылка: https://github.com/robbyrussell/oh-my-zsh/wiki/Cheatsheet


1
Можете ли вы объяснить это более подробно?
bwDraco

@bwDraco type take, тогда вы получите take is a shell function from /home/username/.oh-my-zsh/lib/functions.zsh. VI файл, то вы получитеfunction take() { mkdir -p $@ && cd ${@:$#} }
выходные

10

Что о:

$ mkdir newdirname; cd $_

Это немного проще, чем использовать &&, комбинируя ответы Quack Quixote и KZH.


26
Суть в &&том, что cdне будет выполнено, если mkdirкоманда потерпит неудачу
slhck

1
@slhck, на самом деле, это и было целью кихота: cd, даже если mkdir не работает (например, если он уже существует, что вынуждает пользователя написать вторую команду для фактического перехода к пути к cd) Однако вопреки тому, что говорится в этих ответах, это не для простоты: && не сложнее, чем;.
Моала

7

Вы можете попробовать что-то вроде этого:

#!/bin/sh
mkdir $1 && cd $1

Сохраните этот сценарий в каком-либо месте вашего пути, например, / usr / local / bin или ~ / bin (вы должны поместить этот последний в свой путь в файле ~ / .profile). Тогда вы можете просто позвонить.


4
как это может работать? кажется, что только cdвнутри контекста выполнения ~/bin/mkcdскрипта, а не вызывающего скрипта.
Эрик Аллик


2

Вот простая функция, которую я вставил в свой ~/.config/fish/config.fishфайл, которая выполняет эту задачу:

function mkcd
    mkdir -pv $argv;
    cd $argv;
end

-pvТег позволяет для создания каталогов с подкаталогами.


0

В зависимости от желаемого результата, если каталог уже существует.

Ошибка, если каталог уже существует

mkcd() {
    mkdir $1 && cd $1
}

Изменить каталог независимо

mkcd() {
    mkdir $1 ; cd $1
}

Использование mkcd some / path / to / my / dir


0

Я обнаружил, что нижеприведенная функция может создать только один каталог, если я хочу создать подкаталоги одновременно, он не работает:

function mkdir
{
  command mkdir $1 && cd $1
}

Так что я изменил его, и теперь он отлично работает!

function mkcd
{
  command mkdir -pv $1 && cd $1 && echo "Now in `pwd`"
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.