Как я могу записать mkdir cd в недавно созданный каталог? [dубликат]

На этот вопрос уже есть ответ: как я могу создать каталог и изменить рабочий каталог в новый каталог? 4 ответа

Часто я набираю эти команды в 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
6
задан 20 June 2017 в 23:42

7 ответов

Я обычно следую за mkdir something на cd Alt +. который завершает команду с последним аргументом предыдущей команды, то есть именем каталога.

9
ответ дан 18 July 2018 в 11:20

Я предлагаю создать функцию:

function mydir(){ mkdir -p "$1" && cd "$1"; }

он делает то, что вы хотите, вы можете добавить его в свой .bashrc, чтобы он был доступен во всех ваших оболочках.

] $1 - это первый аргумент, который вы отправляете функции, имя каталога.

Вы можете использовать его как:

$ mydir ~/my-new-directory $ pwd ~/my-new-directory

Примечание: вы можете изменить mydir на mkdir, чтобы переопределить его, однако я предлагаю настраиваемое имя, которое не существует в система, подобная mydir или cmkdir; Вы можете проверить, существует ли команда с помощью type command.

13
ответ дан 18 July 2018 в 11:20

Использование последнего аргумента команды

Вам не нужно повторно указывать имя созданного каталога. Используйте переменную $_:

Из руководства 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 "$_"; } <<<'
12
ответ дан 18 July 2018 в 11:20

Функция

Вы можете сделать небольшую функцию, которую вы можете сохранить в файле ~/.bashrc. Отредактируйте файл, чтобы добавить следующие строки,

md () { mkdir "$1" && cd "$1" }

Запустите

source ~/.bashrc

, чтобы заставить изменение работать в текущем терминале [окно]. Новая функция будет присутствовать при открытии новых терминалов.

Используя функцию между командами, команда cd запускается, только если команда mkdir была успешной.

Пример: я могу использовать функцию md как это, чтобы создать тестовый каталог testdir в текущем каталоге (в этом случае мой домашний каталог, как видно из подсказки),

sudodus@xenial32 ~ $ md testdir sudodus@xenial32 ~/testdir $

Bash shellscript не работает, как я ожидал [ ! d9]

Я также опишу свои трудности с помощью небольшого примера: для этой цели, потому что другие люди могут попробовать его и запутаться.

Вы можете сохранить 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 ~ $

6
ответ дан 18 July 2018 в 11:20

Я предлагаю создать функцию:

function mydir(){ mkdir -p "$1" && cd "$1"; }

он делает то, что вы хотите, вы можете добавить его в свой .bashrc, чтобы он был доступен во всех ваших оболочках.

] $1 - это первый аргумент, который вы отправляете функции, имя каталога.

Вы можете использовать его как:

$ mydir ~/my-new-directory $ pwd ~/my-new-directory

Примечание: вы можете изменить mydir на mkdir, чтобы переопределить его, однако я предлагаю настраиваемое имя, которое не существует в система, подобная mydir или cmkdir; Вы можете проверить, существует ли команда с помощью type command.

13
ответ дан 24 July 2018 в 19:46
  • 1
    Двойная цитата $1, поэтому функция работает для каталогов, содержащих пробелы. – choroba 20 June 2017 в 22:19
  • 2
    Ты это пробовал? Вы должны указать оба аргумента и переменную. – choroba 20 June 2017 в 22:24
  • 3
    @choroba моя ошибка +1, я написал ее с цитированием в моей системе, которая была причиной того, что она работала нормально, обновил ответ;) спасибо. – Ravexina 20 June 2017 в 22:29
  • 4
    Следует заменить ; на &&, чтобы обрабатывать случай, когда mkdir завершается с ошибкой (поскольку он не вызывался с -p) – gardenhead 21 June 2017 в 03:43

Использование последнего аргумента команды

Вам не нужно повторно указывать имя созданного каталога. Используйте переменную $_:

Из руководства 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 "$_"; } <<<'
12
ответ дан 24 July 2018 в 19:46
  • 1
    (1) Вероятно, вы должны упомянуть о том, что требуется ; между последней командой и }. Это частый источник путаницы для людей, привыкших к группировке ( cmd1 ; cmd2 ), где a ; не требуется после последней команды. (2) В случае риска расщепления волос, если у вас есть ; до }, вам не нужно пространство. Кроме того, конечно, пробелы перед точкой с запятой также не требуются. ... (продолжение) – G-Man 22 June 2017 в 05:02
  • 2
    (Cont'd) ... (3) Это действительно умный трюк, заканчивающийся псевдонимом <<<, чтобы захватить аргумент в переменную, которую вы можете использовать несколько раз. Я не помню, чтобы когда-либо видел это раньше, но я добавлю его в свой набор инструментов (хотя он болезненно негибкий). ... (продолжение) – G-Man 22 June 2017 в 05:02
  • 3
    @ G-Man Очень действительные комментарии 1 и 4. Я не знал, что xargs имеет эти проблемы. Я отредактировал свой ответ. Что касается комментария 5, мы могли бы использовать cd "$_" вместо использования "$d" всюду. Просто небольшой пункт, чтобы связать его с предыдущим разделом ответа, не очень важно. – Sergiy Kolodyazhnyy 23 June 2017 в 04:22

Функция

Вы можете сделать небольшую функцию, которую вы можете сохранить в файле ~/.bashrc. Отредактируйте файл, чтобы добавить следующие строки,

md () { mkdir "$1" && cd "$1" }

Запустите

source ~/.bashrc

, чтобы заставить изменение работать в текущем терминале [окно]. Новая функция будет присутствовать при открытии новых терминалов.

Используя функцию между командами, команда cd запускается, только если команда mkdir была успешной.

Пример: я могу использовать функцию md как это, чтобы создать тестовый каталог testdir в текущем каталоге (в этом случае мой домашний каталог, как видно из подсказки),

sudodus@xenial32 ~ $ md testdir sudodus@xenial32 ~/testdir $

Bash shellscript не работает, как я ожидал [ ! d9]

Я также опишу свои трудности с помощью небольшого примера: для этой цели, потому что другие люди могут попробовать его и запутаться.

Вы можете сохранить 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 ~ $

6
ответ дан 24 July 2018 в 19:46
  • 1
    У вас есть это, чтобы работать как сценарий? В самом деле? – G-Man 22 June 2017 в 04:59
  • 2
    @ G-Man, вы правы, он работает как функция, но не работает как скрипт. Текущий каталог изменяется только внутри подпроцесса скрипта, но после завершения скрипта терминал [окно] все еще находится в исходном текущем каталоге. Он работает, когда 'sourced' как source md testdir, но это не удобный способ запустить его. - Я изменю свой ответ. – sudodus 22 June 2017 в 06:21

Другие вопросы по тегам:

Похожие вопросы: