web-dev-qa-db-fra.com

Puis-je utiliser cd ../ .. comme nom d'alias?

J'utilise Windows et Ubuntu en parallèle et je fais des trucs de console sur les deux.

Sous Windows, je peux faire un

C:\Users\Thomas>cd..\..
C:\>

Cependant, sous Linux, cela ne fonctionne pas, ni avec les barres obliques inverses, ni avec les barres obliques.

21:17:10 $ cd../..
bash: cd../..: No such file or directory

Comme je fais souvent cette erreur, j'ai essayé de définir un alias dans .bash_aliases pour cette situation:

alias cd../..='cd ../..'
alias cd..\..='cd ../..'

Quand je commence une nouvelle bash, je reçois

21:16:26 $ bash
bash: alias: `cd../..': invalid alias name

Comment définir des alias pour cd..\.. et cd../.. correctement?

Le cd..\.. semble avoir des problèmes avec le caractère d'échappement:

21:39:43 $ cd..\..
bash: cd....: command not found

Cela ne fonctionne pas, même si je définis un autre alias pour cd.....

11
Thomas Weller

/ et \ font partie des caractères qui ne peuvent pas figurer dans un nom d'alias Bash. De man bash:

Les caractères /, $, `et = ainsi que tous les métacaractères Shell ou les caractères de citation répertoriés ci-dessus peuvent ne pas apparaître sous un nom d'alias.

Pour contourner le problème, vous pouvez passer à Zsh, qui permet à la fois:

% grep 'alias.*cd' .zshrc 
alias cd../..='cd ../..'
alias cd..\\..='cd ../..'
% pwd
/Users/firas
% cd../..
% pwd
/ 
% cd
% pwd
/Users/firas
% cd..\..
% pwd
/
10
fkraiem

Vous ne pouvez pas utiliser de barre oblique dans un nom d'alias. Bash les autorise dans les noms de fonction, cependant, vous pouvez donc en faire une fonction:

cd../.. () { cd ../..; }

Vous ne pouvez pas utiliser de barres obliques inverses dans un alias ou un nom de fonction. La barre oblique inverse cite le caractère suivant. Ainsi, cd..\.. est analysé comme suit: cd...., bien avant que cette chaîne ne soit recherchée comme nom de commande. Si vous souhaitez appeler une commande nommée cd..\.., vous devez taper cd..\\.., 'cd..\..' ou quelque chose d’équivalent. De plus, un nom de commande cité de quelque manière que ce soit n'est pas pris en compte pour la recherche d'alias, vous ne pouvez donc jamais utiliser un nom d'alias contenant une barre oblique inversée. Bash n'autorise pas non plus les barres obliques inverses dans les noms de fonctions. Puisque cd..\.. est analysé comme cd...., vous pouvez définir une fonction appelée cd.... (comme ci-dessus).

Si vous utilisez la commande cd, vous devrez taper l'espace après celle-ci, comme toute autre commande. Mais vous pouvez enregistrer en ne saisissant pas du tout cd. Définissez l'option autocd avec la ligne suivante dans ~/.bashrc:

shopt -s autocd

Ensuite, vous pouvez taper un nom de répertoire sur la ligne de commande et "exécuter" ce répertoire y sera remplacé.

~/some/sub/directory$ ../..
~/some$ 
12
Gilles

"Vous ne pouvez pas utiliser de barre oblique dans un alias ou une fonction nom"? C'est une nouvelle pour moi. J'utilise la fonction Shell suivante depuis des années sous Linux et OS X bash et je n'ai jamais eu aucun problème:

function ../.. { cd ../..; echo "$PWD"; }

Naturellement, cd../.. est également un nom de fonction précis. Une barre oblique peut être utilisée dans un nom de fonction Shell.

En ce qui concerne la version barre oblique inverse, vous ne pouvez pas l’incorporer dans un alias ou un nom de fonction, mais vous n’avez pas à le faire: lorsque vous tapez cd..\.., bash interprète la barre oblique inversée comme un échappement et tente d’exécuter le résultat cd..... Alors définissez cela et vous pouvez faire tout ce que vous vouliez. Je vous en prie.

function cd.... { cd ../..; } 
5
alexis

Si vous voulez conserver les alias, pourquoi ne pas simplement faire:

alias   ..='cd ..'
alias  ...='cd ../../' 
alias ....='cd ../../../'

Ou, si vous avez besoin d'aller aller retour:

alias   .3='cd ../../../' 
alias   .4='cd ../../../../'
alias   .5='cd ../../../../../'
# how far back do you need to go on a normal basis..?

Vous ne savez pas à quel point cela vous aide à rester mentalement synchronisé avec votre cerveau Windows, mais cela semble tout de même être une solution simple. (Au moins pour ceux d'entre nous qui avons la chance de ne pas avoir à s'inquiéter de la façon dont les choses se passent sous Windows.)

2
jon