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 mkdir
cd
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
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
.
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 $_
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 "$_"; } <<<'
Je suis généralement mkdir something
de cd
Alt + . qui termine la commande avec le dernier argument de la commande précédente, c’est-à-dire le nom du répertoire.
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 $
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 ~ $