Как я могу вставить mkdir в только что созданный каталог?

Часто я набираю эти команды в bash:

mkdir something
cd something

Я почти никогда не делаю этого:

mkdir something
ls # something in the current directory, not ./something/

И никогда этого

mkdir something something2

Как я могу иметь mkdircd во вновь созданный каталог? Я имею в виду, если я 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 от cdAlt + . которая завершает команду с последним аргументом предыдущей команды, то есть именем каталога.

функция

Вы можете сделать небольшую функцию, которую вы можете сохранить в файле ~/.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 ~ $ 
Другие вопросы по тегам