Мені здається, що я повторюю багато:
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 $_
ви опинитесь в новому папку вдома !! (або ~ / нова папка)
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:) Чудово! btw - 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як альтернативу.
Я зробив сценарій, який створює каталог, а потім 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. Яку перевагу має це над прийнятою відповіддю? ………………………………………………………………………… PS Це не вдасться через проблеми котирування, що говорить мені, що ви навіть самі не пробували цього.
mcdз сайту unix.stackexchange.com/questions/6628/…