На этот вопрос уже есть ответ здесь:
Часто я печатаю эти команды в 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
Я предлагаю создать функцию:
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
Высокий звук +. , который завершает команду с последним аргументом предыдущей команды, т.е. имя каталога.
Вы не должны перепечатывать название созданного каталога. Использовать $_
переменная:
От удара 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 $
Я также опишу свои трудности с помощью маленького сценария оболочки удара с этой целью, потому что другие люди могли бы попробовать его и запутаться.
Можно сохранить сценарий оболочки в каталоге ~/bin
. После создания ~/bin
и перезагрузка, это будет в ПУТИ.
Используйте имя, которое не используется никакой стандартной командой (например, mdscript
),
#!/bin/bash
mkdir "$1" && cd "$1"
Сделайте исполняемый файл сценария
chmod ugo+x ~/bin/mdscript
Это не работает, как предназначено с
mdscript testdir
потому что текущий каталог только изменяется в подпроцессе сценария оболочки, но не в терминале [окно] после окончания сценария оболочки.
Это работает при 'получении', выполнении с командной строкой
source mdscript testdir
но это не удобно, не хороший ответ на исходный вопрос.
Вы видите, как это работает, если Вы добавляете a pwd
команда в сценарий оболочки
#!/bin/bash
mkdir "$1" && cd "$1"
pwd
и запущенный скрипт mdscript
sudodus@xenial32 ~ $ mdscript testdir
/home/sudodus/testdir
sudodus@xenial32 ~ $