web-dev-qa-db-fra.com

Comment puis-je avoir mkdir cd dans le répertoire nouvellement créé?

Fréquemment, je tape ces commandes dans bash:

mkdir something
cd something

Je ne fais presque jamais ça:

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

Et jamais ça:

mkdir something something2

Comment puis-je avoir mkdircd dans le répertoire nouvellement créé? J'entends par là que si je mkdir something, la commande cd something est exécutée immédiatement après.

Exemple:

$ pwd
/home/me
$ mkdir something
$ pwd
/home/me/something
8
programmer5000

Je suggère de créer une fonction:

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

il fait ce que vous voulez, vous pouvez l'ajouter à votre .bashrc pour qu'il soit disponible dans tous vos shells.

  • $1 est le premier argument que vous envoyez à la fonction, le nom du répertoire.

Vous pouvez l'utiliser comme:

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

Remarque: vous pouvez modifier mydir avec mkdir pour le remplacer. Toutefois, je suggère un nom personnalisé qui n’existe pas dans le système, comme mydir ou cmkdir; Vous pouvez vérifier s'il existe une commande à l'aide de type command.

14
Ravexina

Utiliser le dernier argument de la commande

Vous n'avez pas à retaper le nom du répertoire créé. Utilisez la variable $_:

De bash 4.3 manuel:

   _      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.  

Donc, l'utilisation serait comme telle:

bash-4.3$ mkdir mydir
bash-4.3$ cd $_

Utilisation de la commande composée '{list;}'

Si nous voulions utiliser une seule ligne, combinez les commandes en une commande composée { (notez que les espaces précédant { et des points-virgules pour chaque commande sont obligatoires):

bash-4.3$ pwd
/home/xieerqi
bash-4.3$ { mkdir mydir;cd $_;}
bash-4.3$ pwd
/home/xieerqi/mydir

Il est important de noter que cette structure de commande composée {list;} est choisie pour une raison quelconque, car toutes les commandes de la liste sont exécutées dans l'environnement Shell en cours.

Et si nous voulons éviter de tout taper à l'infini, nous pouvons en faire un alias.

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

Ici, j'ai utilisé la variable "$d" pour les deux, mais j'aurais tout aussi bien pu utiliser le même "$_":

bash-4.3$ alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$_"; } <<<'
14

Je suis généralement mkdir something de cdAlt + . qui termine la commande avec le dernier argument de la commande précédente, c’est-à-dire le nom du répertoire.

9
choroba

Une fonction

Vous pouvez créer un petit fonction, que vous pouvez stocker dans le fichier ~/.bashrc. Editez le fichier pour ajouter les lignes suivantes,

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

Courir

source ~/.bashrc

afin de faire fonctionner le changement dans le terminal actuel [fenêtre]. La nouvelle fonction sera là lorsque vous ouvrirez de nouveaux terminaux.

L'utilisation de && entre les commandes permet d'exécuter la commande cd uniquement si la commande mkdir a abouti.

Exemple: Je peux utiliser la fonction md comme celle-ci pour créer un répertoire de test testdir dans le répertoire actuel (dans ce cas, mon répertoire personnel, tel qu'il est vu depuis l'invite),

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

Bash shellscript n'a pas fonctionné comme prévu

Je vais également décrire mes difficultés en utilisant un petit bash shellscript à cette fin, car d’autres personnes pourraient l’essayer et en devenir confuses.

Vous pouvez stocker un script de shell dans le répertoire ~/bin. Après avoir créé ~/bin et redémarré, il sera dans PATH.

Utilisez un nom qui n’est utilisé par aucune commande standard (par exemple mdscript),

#!/bin/bash

mkdir "$1" && cd "$1"

Rendre le script exécutable

chmod ugo+x ~/bin/mdscript

Cela ne fonctionne pas comme prévu avec

mdscript testdir

parce que le répertoire en cours n'est modifié que dans le sous-processus du script shell, mais pas dans le terminal [fenêtre] une fois le shellscript terminé.

Cela fonctionne quand 'sourced', exécuté avec la ligne de commande

source mdscript testdir

mais ce n'est pas pratique, ce n'est pas une bonne réponse à la question initiale.

Vous pouvez voir comment cela fonctionne si vous ajoutez une commande pwd dans le shellscript

#!/bin/bash

mkdir "$1" && cd "$1"
pwd

et lancez le script mdscript

sudodus@xenial32 ~ $ mdscript testdir
/home/sudodus/testdir
sudodus@xenial32 ~ $ 
6
sudodus