Часто я набираю эти команды в bash:
mkdir something
cd something
Я почти никогда этого не делаю:
mkdir something
ls # something in the current directory, not ./something/
И никогда это:
mkdir something something2
Как я могу mkdir cd войти в только что созданный каталог? Под этим я подразумеваю, что если I mkdir something, то команда cd something выполняется сразу после.
Пример:
$ pwd
/home/me
$ mkdir something
$ pwd
/home/me/something
Я обычно следую за mkdir something на cd Alt +. который завершает команду с последним аргументом предыдущей команды, то есть именем каталога.
Я предлагаю создать функцию:
function mydir(){ mkdir -p "$1" && cd "$1"; }
он делает то, что вы хотите, вы можете добавить его в свой .bashrc, чтобы он был доступен во всех ваших оболочках.
] $1 - это первый аргумент, который вы отправляете функции, имя каталога.Вы можете использовать его как:
$ mydir ~/my-new-directory
$ pwd
~/my-new-directory
Примечание: вы можете изменить mydir на mkdir, чтобы переопределить его, однако я предлагаю настраиваемое имя, которое не существует в система, подобная mydir или cmkdir; Вы можете проверить, существует ли команда с помощью type command.
Вам не нужно повторно указывать имя созданного каталога. Используйте переменную $_:
Из руководства 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 $_
Если мы хотим использовать только одну строку, объедините команды в составную команду { (обратите внимание, что перед пробелом перед { и точкой с запятой для каждой команды требуются):
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 "$_"; } <<<'
Вы можете сделать небольшую функцию, которую вы можете сохранить в файле ~/.bashrc. Отредактируйте файл, чтобы добавить следующие строки,
md () {
mkdir "$1" && cd "$1"
}
Запустите
source ~/.bashrc
, чтобы заставить изменение работать в текущем терминале [окно]. Новая функция будет присутствовать при открытии новых терминалов.
Используя функцию между командами, команда cd запускается, только если команда mkdir была успешной.
Пример: я могу использовать функцию md как это, чтобы создать тестовый каталог testdir в текущем каталоге (в этом случае мой домашний каталог, как видно из подсказки),
sudodus@xenial32 ~ $ md testdir
sudodus@xenial32 ~/testdir $
Я также опишу свои трудности с помощью небольшого примера: для этой цели, потому что другие люди могут попробовать его и запутаться.
Вы можете сохранить shellscript в каталоге ~/bin. После создания ~/bin и перезагрузки он будет находиться в PATH.
Используйте имя, которое не используется какой-либо стандартной командой (например, mdscript),
#!/bin/bash
mkdir "$1" && cd "$1"
Сделать скрипт исполняемым
chmod ugo+x ~/bin/mdscript
Это не работает по назначению с
mdscript testdir
, потому что текущий каталог изменяется только в подпроцессе shell-скрипта, но а не в терминале [window] после завершения shellscript.
Он работает, когда «sourced», выполняется с командной строкой
source mdscript testdir
, но это не удобно, а не полезно ответ на исходный вопрос.
Вы можете увидеть, как это работает, если вы добавите команду pwd в shellscript
#!/bin/bash
mkdir "$1" && cd "$1"
pwd
и запустите скрипт mdscript
sudodus@xenial32 ~ $ mdscript testdir
/home/sudodus/testdir
sudodus@xenial32 ~ $
Я предлагаю создать функцию:
function mydir(){ mkdir -p "$1" && cd "$1"; }
он делает то, что вы хотите, вы можете добавить его в свой .bashrc, чтобы он был доступен во всех ваших оболочках.
] $1 - это первый аргумент, который вы отправляете функции, имя каталога.Вы можете использовать его как:
$ mydir ~/my-new-directory
$ pwd
~/my-new-directory
Примечание: вы можете изменить mydir на mkdir, чтобы переопределить его, однако я предлагаю настраиваемое имя, которое не существует в система, подобная mydir или cmkdir; Вы можете проверить, существует ли команда с помощью type command.
Вам не нужно повторно указывать имя созданного каталога. Используйте переменную $_:
Из руководства 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 $_
Если мы хотим использовать только одну строку, объедините команды в составную команду { (обратите внимание, что перед пробелом перед { и точкой с запятой для каждой команды требуются):
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 "$_"; } <<<'
Вы можете сделать небольшую функцию, которую вы можете сохранить в файле ~/.bashrc. Отредактируйте файл, чтобы добавить следующие строки,
md () {
mkdir "$1" && cd "$1"
}
Запустите
source ~/.bashrc
, чтобы заставить изменение работать в текущем терминале [окно]. Новая функция будет присутствовать при открытии новых терминалов.
Используя функцию между командами, команда cd запускается, только если команда mkdir была успешной.
Пример: я могу использовать функцию md как это, чтобы создать тестовый каталог testdir в текущем каталоге (в этом случае мой домашний каталог, как видно из подсказки),
sudodus@xenial32 ~ $ md testdir
sudodus@xenial32 ~/testdir $
Я также опишу свои трудности с помощью небольшого примера: для этой цели, потому что другие люди могут попробовать его и запутаться.
Вы можете сохранить shellscript в каталоге ~/bin. После создания ~/bin и перезагрузки он будет находиться в PATH.
Используйте имя, которое не используется какой-либо стандартной командой (например, mdscript),
#!/bin/bash
mkdir "$1" && cd "$1"
Сделать скрипт исполняемым
chmod ugo+x ~/bin/mdscript
Это не работает по назначению с
mdscript testdir
, потому что текущий каталог изменяется только в подпроцессе shell-скрипта, но а не в терминале [window] после завершения shellscript.
Он работает, когда «sourced», выполняется с командной строкой
source mdscript testdir
, но это не удобно, а не полезно ответ на исходный вопрос.
Вы можете увидеть, как это работает, если вы добавите команду pwd в shellscript
#!/bin/bash
mkdir "$1" && cd "$1"
pwd
и запустите скрипт mdscript
sudodus@xenial32 ~ $ mdscript testdir
/home/sudodus/testdir
sudodus@xenial32 ~ $