web-dev-qa-db-fra.com

Combiné `mkdir` et` cd`?

existe-t-il un moyen (quel est le moyen le plus simple dans bash) de combiner les éléments suivants:

mkdir foo
cd foo

La page de manuel de mkdir ne décrit rien de tel, peut-être existe-t-il une version raffinée de mkdir? Je sais que cd doit être intégré à Shell, donc la même chose serait vraie pour la fantaisie mkdir...

Aliasing?

141
Jasper

Une fonction?

mkcdir ()
{
    mkdir -p -- "$1" &&
      cd -P -- "$1"
}

Mettez le code ci-dessus dans le ~/.bashrc ou un autre fichier provenant du ~/.bashrc. Redémarrez ensuite le terminal pour que les modifications s'appliquent.

Après cela, exécutez simplement mkcdir foo ou mkcdir "nested/path/in quotes".

Remarques:

  • "$1" est le premier argument de la commande mkcdir. Les citations qui l'entourent protègent l'argument s'il contient des espaces ou d'autres caractères spéciaux.
  • -- s'assure que le nom passé pour le nouveau répertoire n'est pas interprété comme une option pour mkdir ou cd, donnant la possibilité de créer un répertoire commençant par - ou --.
  • -p utilisé sur mkdir lui fait créer des répertoires supplémentaires s'ils n'existent pas encore, et -P utilisé fait cd résoudre les liens symboliques.
114
Ouki

Je pense que la création d'une fonction est la façon la plus appropriée de le faire, mais juste pour lister toutes les autres manières, vous pouvez écrire:

mkdir foo && cd "$_"

$_ est un paramètre spécial qui contient le dernier argument de la commande précédente. La citation autour de $_ assurez-vous que cela fonctionne même si le nom du dossier contient des espaces.

Pourquoi utiliser des guillemets doubles?

Dans certains shells, tels que zsh, les guillemets doubles entourant le $_ ne sont pas nécessaires même lorsque le nom du répertoire contient des espaces. Ils sont cependant nécessaires pour que cette commande fonctionne dans bash.

Par exemple, exécuter cette commande dans bash 3.2.57 sur macOS 10.13.6:

mkdir "my directory" && cd $_

donne cette sortie:

bash: cd: my: No such file or directory

Cependant, si nous entourons $_ avec des guillemets doubles, la commande revient avec succès.

bash-3.2$ mkdir "my directory" && cd "$_"
bash-3.2$ echo $?
0
bash-3.2$
256
Zajn

Bash (à l'aide de désignateurs Word):

/tmp/bug$ mkdir "some dir"
/tmp/bug$ cd !$
cd "some dir"
/tmp/bug/some dir$ 

!$ se développe jusqu'au dernier argument de la ligne précédente de l'historique. Si vous avez des paramètres entre les deux, vous pouvez utiliser !:1 pour le premier argument, !:2pour le deuxième argument, etc.

De bash (1):

Designateurs d'événements

Un indicateur d'événement est une référence à une entrée de ligne de commande dans la liste d'historique. Sauf si la référence est absolue, les événements sont relatifs à la position actuelle dans la liste d'historique.

! Démarrer une substitution d'historique, sauf lorsqu'elle est suivie d'un blanc, d'un retour à la ligne, d'un retour chariot, = ou ( (lorsque l'option shell extglob est activée à l'aide de la fonction intégrée shopt).

[..]

Désignateurs de mots

Les désignateurs de mots sont utilisés pour sélectionner les mots souhaités de l'événement. UNE : sépare la spécification d'événement de l'indicateur Word. [..]

[..]
n Le n - ème mot.
^ Le premier argument. Autrement dit, Word 1.
$ Le dernier mot. Il s'agit généralement du dernier argument, mais sera étendu au mot zéro s'il n'y a qu'un seul mot dans la ligne.

17
Lekensteyn

Ces autres gars ne font que compliquer la vie, la voici:

eval {mkdir,cd}\ FOLDER\;
10
Sean D