Как я могу вставить mkdir в только что созданный каталог?
Часто я набираю эти команды в bash:
mkdir something
cd something
Я почти никогда не делаю этого:
mkdir something
ls # something in the current directory, not ./something/
И никогда этого
mkdir something something2
Как я могу иметь mkdir
cd
во вновь созданный каталог? Я имею в виду, если я mkdir something
чем команда cd something
выполняется сразу после.
Пример:
$ pwd
/home/me
$ mkdir something
$ pwd
/home/me/something
4 ответа
Используя последний аргумент команды
Вам не нужно повторно вводить имя созданного каталога. использование $_
переменная:
Из руководства по bash 4.3:
_ At shell startup, set to the absolute pathname used to invoke the shell or shell script being executed as passed in the environment or argument list. Sub‐ sequently, expands to the last argument to the pre‐ vious command, after expansion.
Так что использование будет так:
bash-4.3$ mkdir mydir
bash-4.3$ cd $_
Использование составной команды '{list;}'
Если мы хотим использовать только одну строку, объедините команды в составную команду {
(обратите внимание, что ведущий пробел перед {
и точки с запятой для каждой команды):
bash-4.3$ pwd
/home/xieerqi
bash-4.3$ { mkdir mydir;cd $_;}
bash-4.3$ pwd
/home/xieerqi/mydir
Важно отметить, что это {list;}
составная структура команд выбрана по причине, потому что все команды в списке выполняются в текущей среде оболочки.
И если мы хотим избежать многократного ввода текста, мы можем сделать из него псевдоним.
bash-4.3$ alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'
bash-4.3$ pwd
/home/xieerqi
bash-4.3$ mkcd "mydir"
bash-4.3$ pwd
/home/xieerqi/mydir
Здесь я использовал "$d"
переменная для обоих, но я мог бы одинаково использовать "$_"
:
bash-4.3$ alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$_"; } <<<'
Я предлагаю создать функцию:
function mydir(){ mkdir -p "$1" && cd "$1"; }
он делает то, что вы хотите, вы можете добавить его в свой .bashrc
так что он будет доступен во всех ваших оболочках.
$1
это первый аргумент, который вы отправляете функции, имя каталога.
Вы можете использовать его как:
$ mydir ~/my-new-directory
$ pwd
~/my-new-directory
Примечание: вы можете изменить mydir
с mkdir
чтобы переопределить его, однако я предлагаю пользовательское имя, которое не существует в системе, как mydir
или же cmkdir
; Вы можете проверить, существует ли команда, используя type command
,
Я обычно следую mkdir something
от cd
Alt + . которая завершает команду с последним аргументом предыдущей команды, то есть именем каталога.
функция
Вы можете сделать небольшую функцию, которую вы можете сохранить в файле ~/.bashrc
, Отредактируйте файл, добавив следующие строки:
md () {
mkdir "$1" && cd "$1"
}
Бежать
source ~/.bashrc
чтобы изменения работали в текущем терминале [окне]. Новая функция будет там, когда вы откроете новые терминалы.
С помощью &&
между командами делает cd
Команда запускается только если mkdir
Команда была успешной.
Пример: я могу использовать функцию md
как это, чтобы создать тестовый каталог testdir
в текущем каталоге (в этом случае мой домашний каталог, как видно из приглашения),
sudodus@xenial32 ~ $ md testdir
sudodus@xenial32 ~/testdir $
Сценарий Bash не работает, как я ожидал
Я также опишу свои трудности с использованием небольшого сценария bash для этой цели, потому что другие люди могут попробовать и запутаться.
Вы можете хранить скрипт в каталоге ~/bin
, После создания ~/bin
и перезагрузка, это будет в PATH.
Используйте имя, которое не используется ни одной стандартной командой (например, mdscript
),
#!/bin/bash
mkdir "$1" && cd "$1"
Сделайте скрипт исполняемым
chmod ugo+x ~/bin/mdscript
Это не работает как задумано с
mdscript testdir
потому что текущий каталог изменяется только в подпроцессе сценария оболочки, но не в терминале [окне] после завершения сценария оболочки.
Это работает, когда 'sourced', запускается из командной строки
source mdscript testdir
но это не удобно, не очень хороший ответ на оригинальный вопрос.
Вы можете увидеть, как это работает, если вы добавите pwd
команда в сценарий
#!/bin/bash
mkdir "$1" && cd "$1"
pwd
и запустить скрипт mdscript
sudodus@xenial32 ~ $ mdscript testdir
/home/sudodus/testdir
sudodus@xenial32 ~ $