Я повторяю много:
mkdir longtitleproject
cd longtitleproject
Есть ли способ сделать это в одной строке, не повторяя имя каталога? Я здесь на башке.
mkdir longtitleproject
тогдаcd !^
Я повторяю много:
mkdir longtitleproject
cd longtitleproject
Есть ли способ сделать это в одной строке, не повторяя имя каталога? Я здесь на башке.
mkdir longtitleproject
тогдаcd !^
Ответы:
Там нет встроенной команды, но вы можете легко написать функцию, которая mkdir
затем вызывает cd
:
mkcd () {
mkdir "$1"
cd "$1"
}
Поместите этот код в свой ~/.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
. Исправление: используйте &&
для разделения двух команд.Все еще довольно просто:
mkcd () {
case "$1" in /*) :;; *) set -- "./$1";; esac
mkdir -p "$1" && cd "$1"
}
Эта версия по-прежнему может 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
никогда не нужно видеть ..
).
Мы приходим к этой надежной, хотя и немного кровавой версии:
mkcd () {
case "$1" in
*/..|*/../) cd -- "$1";; # that doesn't make any sense unless the directory already exists
/*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "$1";;
/*) mkdir -p "$1" && cd "$1";;
*/../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./$1";;
../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
*) mkdir -p "./$1" && cd "./$1";;
esac
}
(Упражнение: почему я использую подоболочку для первого cd
звонка?)
В случае сбоя mkdir я хочу быть уверенным, что текущий каталог не будет изменен. Возвращение с помощью cd - или $ OLDPWD недостаточно, если оболочка не имеет разрешения перейти в свой текущий каталог. Кроме того, вызов cd обновляет OLDPWD, поэтому мы хотим сделать это только один раз (или восстановить OLDPWD).
Существуют также менее специализированные способы не вводить слово из предыдущей строки:
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
.
Это тот вкладыш, который вам нужен. Никаких других настроек не требуется:
mkdir longtitleproject && cd $_
$_
Переменная, в Баш, это последний аргумент , который в предыдущей команде. В этом случае имя каталога, который вы только что создали. Как объяснено в man bash
:
_ At shell startup, set to the absolute pathname used to invoke
the shell or shell script being executed as passed in the envi‐
ronment or argument list. Subsequently, expands to the last
argument to the previous command, after expansion. Also set to
the full pathname used to invoke each command executed and
placed in the environment exported to that command. When check‐
ing mail, this parameter holds the name of the mail file cur‐
rently being checked."$_" is the last argument of the previous command.
Используется cd $_
для получения последнего аргумента предыдущей команды, а не cd !$
потому, что cd !$
дает последний аргумент предыдущей команды в истории оболочки :
cd ~/
mkdir folder && cd !$
вы в конечном итоге домой (или ~ /)
cd ~/
mkdir newfolder && cd $_
Вы попадаете в новую папку под домом !! (или ~ / newfolder)
mkdir foo && cd foo
, что не удобно.
Мне никогда бы не пришло в голову описать это поведение, потому что я вводил следующее почти ежечасно ...
$ mkdir someDirectory<ENTER>
$ cd !$
где bash любезно заменяет !$
последнее слово последней строки; т.е. длинное имя каталога, которое вы ввели.
Кроме того, завершение имени файла является вашим другом в таких ситуациях. Если ваш новый каталог был единственным файлом в папке, быстрый двойник TABдаст вам новый каталог без повторного ввода.
Хотя это здорово, что bash позволяет вам выполнять такие распространенные задачи, как и другие ответы, я думаю, что лучше изучить функции редактирования командной строки, которые предлагает bash, чтобы при работе на другом компьютере не пропустить синтаксический сахар, который предоставляют ваши пользовательские скрипты.
В соответствии с какими настройками вы сделали свой профиль оболочки для повышения производительности? Вот как я это делаю:
# make a directory and cd to it
mcd()
{
test -d "$1" || mkdir "$1" && cd "$1"
}
это означает, что это также работает, если каталог уже существует.
-p
Возможность MKDIR будет подавлять ошибки.
mcd
? Какой пакет или проект предоставляет эту команду?
Если вы используете Oh My Zsh, есть команда take, которая делает именно это. Это будет выглядеть примерно так.
take myfolder
Я нашел это случайно. Я только что посмотрел, и он включен в этот чит-хит из вики Oh My Zsh GitHub. Это довольно полезная команда, и, видимо, ее очень легко создать самостоятельно.
take
:) Идеально! Кстати - iTerm2 с Oh My Zsh. Здесь на самом деле есть 3 идеальных ответа. Этот, один @ jesús-carrera, и выбранный ответ. Зависит от ваших настроек и предпочтений.
Вот небольшой вариант, который стоит упомянуть:
function mkdir() {
local dir=$1
command mkdir "$dir" && cd "$dir"
}
Добавьте это к вашему, ~/.bash_profile
и вы сможете использовать его mkdir
как обычно (как только вы это сделаете source
), за исключением того, что теперь он будет запускать функцию выше, а не стандартную mkdir
команду.
Обратите внимание, что это не проверяет ввод в соответствии с принятым ответом Жиля , но демонстрирует, как вы можете (эффективно) переопределить встроенные функции.
Из документов (слегка перефразируя):
command mkdir [args]
работаетmkdir
сargs
игнорированием любой именованной функции оболочкиmkdir
. Выполняются только встроенные команды оболочки или команды, найденные путем поиска в PATH. Если существует именованная функция оболочкиls
, выполнениеcommand ls
внутри функции выполнит внешнюю командуls
вместо рекурсивного вызова функции
Я считаю, что builtin
достигает аналогичного результата command
.
$dir
command
в качестве альтернативы.
Создать mkcd
команду для вашей среды в одну строку
echo -e 'mkcd() {\n mkdir -p "$1" && cd $_\n}' >> ~/.${0//-/}rc && . ~/.${0//-/}rc
Я сделал скрипт, который создает каталог, а затем cd для него, затем я дал ему псевдоним. И вот суть, где я это описываю.
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
Просто автоматизировал вышеуказанные ответы и сделал одноразовый исполняемый скрипт:
fun='
mkcd ()
{
mkdir -p -- "$1" && cd -P -- "$1"
}'
echo "$fun" >> ~/.bashrc
Просто скопируйте это в новый файл mkcd.sh
и запустите его только один раз в терминале bash mkcd.sh
. Затем выполните source ~/.bashrc
его, чтобы он работал в текущем сеансе.
После этого вы можете использовать mkcd some_dir
для создания и ввода непосредственно в этот каталог.
~/.bashrc
файл (с ответом, который уже был дан)? А как вы предлагаете создать этот mkcd.sh
скрипт? С редактором, возможно? Это похоже на большую работу, чем просто редактирование ~/.bashrc
. Какое преимущество это имеет перед принятым ответом? ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... Это не удастся из-за цитирования вопросов, которые говорят мне, что вы даже сами не пробовали.
mcd
с unix.stackexchange.com/questions/6628/…