Я повторяю много:
mkdir longtitleproject
cd longtitleproject
Есть ли способ сделать это в одной строке, не повторяя имя каталога? Я здесь на башке.
bash
shell
command-line
methodofaction
источник
источник
mcd
с unix.stackexchange.com/questions/6628/…mkdir longtitleproject
тогдаcd !^
Ответы:
Там нет встроенной команды, но вы можете легко написать функцию, которая
mkdir
затем вызываетcd
:Поместите этот код в свой
~/.bashrc
файл (или~/.kshrc
для пользователей ksh, или~/.zshrc
для пользователей zsh). Он определяет функцию с именемmkcd
."$1"
будет заменен аргументом функции при запуске.Эта простая версия имеет несколько недостатков:
-p
параметр вmkdir
. (Это может или не может быть желательным, так как это увеличивает риск того, что опечаткаmkcd mydierctory/newsub
останется незамеченной, например , удачно создастсяmydierctory
иmydierctory/newsub
когда вы намеревались создатьnewsub
внутри существующегоmydirectory
.)-
но не просто-
, тоmkdir
иcd
будет интерпретировать его как вариант. Если это просто-
, тоcd
истолковать это значит$OLDPWD
. Если за+
ним следуют 0 или более цифр, тоcd
в zsh он будет интерпретироваться как индекс в стеке каталогов. Вы можете исправить первую проблему, но не две другие, передав--
перед аргументом. Вы можете исправить все эти проблемы, добавив./
аргумент, если это относительный путь.mkdir
не следуетCDPATH
, ноcd
делает, поэтому, если вы установилиCDPATH
значение, которое не начинается с.
(по общему признанию, несколько необычной конфигурации), тоcd
вы можете перейти в каталог, отличный от только что созданного. Предварение./
относительных путей исправления этого (он вызываетCDPATH
игнорироваться).mkdir
не удается, он пытается выполнитьcd
. Исправление: используйте&&
для разделения двух команд.Все еще довольно просто:
Эта версия по-прежнему может
cd
переместиться в каталог, отличный от того, которыйmkdir
только что был создан в одном крайнем случае: если аргументmkcd
содержит..
и проходит через символическую ссылку. Например, если текущий каталог является/tmp/here
иmylink
является символической ссылкой на/somewhere/else
, тоmkdir mylink/../foo
создает,/somewhere/else/foo
тогда какcd mylink/../foo
изменяется наfoo
. Недостаточно искать символические ссылки в аргументе, поскольку оболочка также отслеживает символические ссылки в своем текущем каталоге, поэтомуcd /tmp/mylink; mkdir ../foo; cd ../foo
не переходит в новый каталог (/somewhere/else/foo
), а в/tmp/foo
. Исправление для этого - позволитьcd
встроенному разрешить..
сначала все компоненты пути (не имеет смысла использовать,foo/..
еслиfoo
не существует, поэтомуmkdir
никогда не нужно видеть..
).Мы приходим к этой надежной, хотя и немного кровавой версии:
(Упражнение: почему я использую подоболочку для первого
cd
звонка?)Существуют также менее специализированные способы не вводить слово из предыдущей строки:
cd
, затем Esc .(или Alt+ .), чтобы вставить последний аргумент из предыдущей команды.cd !$
выполняетсяcd
по последнему аргументу предыдущей команды.mkdir
вcd
.источник
ksh
, а также работающая вzsh
) для «повторить последнее слово предыдущей команды». Я использую это довольно часто./a/b/..//
самом деле будет работать, но нет/a/b/../c
. Исправлена. Я поставил вопрос перед более широкой аудиторией.mkcd() { mkdir -p "$1" && cd "$1"; }
Кажется, не проблема в (мой случай) Zsh.mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; ln -s /var/tmp/somewhere/else mylink; mkdir -p mylink/../foo && cd mylink/../foo; pwd
(включает в себя настройки и) отображает/tmp/here/foo
то, что было создано (и что я ожидал).bash
ошибочно создает и изменяет/var/tmp/somewhere/foo
.Это тот вкладыш, который вам нужен. Никаких других настроек не требуется:
$_
Переменная, в Баш, это последний аргумент , который в предыдущей команде. В этом случае имя каталога, который вы только что создали. Как объяснено вman bash
:Используется
cd $_
для получения последнего аргумента предыдущей команды, а неcd !$
потому, чтоcd !$
дает последний аргумент предыдущей команды в истории оболочки :вы в конечном итоге домой (или ~ /)
Вы попадаете в новую папку под домом !! (или ~ / newfolder)
источник
mkdir foo && cd foo
, что не удобно.Мне никогда бы не пришло в голову описать это поведение, потому что я вводил следующее почти ежечасно ...
где bash любезно заменяет
!$
последнее слово последней строки; т.е. длинное имя каталога, которое вы ввели.Кроме того, завершение имени файла является вашим другом в таких ситуациях. Если ваш новый каталог был единственным файлом в папке, быстрый двойник TABдаст вам новый каталог без повторного ввода.
Хотя это здорово, что bash позволяет вам выполнять такие распространенные задачи, как и другие ответы, я думаю, что лучше изучить функции редактирования командной строки, которые предлагает bash, чтобы при работе на другом компьютере не пропустить синтаксический сахар, который предоставляют ваши пользовательские скрипты.
источник
В соответствии с какими настройками вы сделали свой профиль оболочки для повышения производительности? Вот как я это делаю:
это означает, что это также работает, если каталог уже существует.
источник
-p
Возможность MKDIR будет подавлять ошибки.mcd
? Какой пакет или проект предоставляет эту команду?Если вы используете Oh My Zsh, есть команда take, которая делает именно это. Это будет выглядеть примерно так.
Я нашел это случайно. Я только что посмотрел, и он включен в этот чит-хит из вики Oh My Zsh GitHub. Это довольно полезная команда, и, видимо, ее очень легко создать самостоятельно.
источник
take
:) Идеально! Кстати - iTerm2 с Oh My Zsh. Здесь на самом деле есть 3 идеальных ответа. Этот, один @ jesús-carrera, и выбранный ответ. Зависит от ваших настроек и предпочтений.Или вы можете просто создать короткую переменную на лету и использовать ее дважды
x = longproject ; mkdir $x ; cd $x
- что, я признаю, все еще дольше, чем использование функции шеллскрипта :)источник
Вот небольшой вариант, который стоит упомянуть:
Добавьте это к вашему,
~/.bash_profile
и вы сможете использовать егоmkdir
как обычно (как только вы это сделаетеsource
), за исключением того, что теперь он будет запускать функцию выше, а не стандартнуюmkdir
команду.Обратите внимание, что это не проверяет ввод в соответствии с принятым ответом Жиля , но демонстрирует, как вы можете (эффективно) переопределить встроенные функции.
Из документов (слегка перефразируя):
Я считаю, что
builtin
достигает аналогичного результатаcommand
.источник
$dir
command
в качестве альтернативы.Добавление вспомогательной функции в BASH, ZSH или KSH
Создать
mkcd
команду для вашей среды в одну строкуисточник
Я сделал скрипт, который создает каталог, а затем cd для него, затем я дал ему псевдоним. И вот суть, где я это описываю.
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
источник
Просто автоматизировал вышеуказанные ответы и сделал одноразовый исполняемый скрипт:
Просто скопируйте это в новый файл
mkcd.sh
и запустите его только один раз в терминалеbash mkcd.sh
. Затем выполнитеsource ~/.bashrc
его, чтобы он работал в текущем сеансе.После этого вы можете использовать
mkcd some_dir
для создания и ввода непосредственно в этот каталог.источник
~/.bashrc
файл (с ответом, который уже был дан)? А как вы предлагаете создать этотmkcd.sh
скрипт? С редактором, возможно? Это похоже на большую работу, чем просто редактирование~/.bashrc
. Какое преимущество это имеет перед принятым ответом? ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... Это не удастся из-за цитирования вопросов, которые говорят мне, что вы даже сами не пробовали.