Мені здається, що я повторюю багато:
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/…