Utilisez «cd -» sans aucune sortie

28

Comment exécuter la cd -commande sans reproduire aucune sortie?
J'ai essayé cd - 2>&1 /dev/nullmais cela imprime le répertoire de destination.
La raison en est que je voudrais l'utiliser comme une fonction bash et je préférerais ne pas avoir la sortie inutile.

Batandwa
la source

Réponses:

32

Essayez-le comme ceci:

cd - > /dev/null

Vous pouvez également faire:

cd - > uselessfile

Cela enverra la sortie vers le fichier "uselessfile" au lieu de STDOUT.

Vous pouvez également ajouter au lieu de créer ou d'écraser le fichier.

cd - >> uselessfile
erewok
la source
15

@erewok a déjà répondu à la question , mais je vais essayer d' expliquer ce qui se passe réellement et pourquoi vous voyez le comportement que vous faites.

Le problème vient de votre redirection. Tu écris:

cd - 2>&1 /dev/null

parce que les redirections peuvent apparaître n'importe où dans la ligne de commande (vous pouvez le confirmer vous-même avec quelque chose de simple comme echo a b 2>&1 c </etc/fstab d ), après que les redirections soient supprimées devient en fait:

cd - /dev/null

Vous voyez le problème? Vous passez deux arguments à cd, pas un argument et deux redirections. Étant donné que vous ne pouvez être que dans un seul répertoire en cours à la fois,cd ne considère que son premier argument, qui dans ce cas est le -.

Qu'est - ce que vous avez probablement l' intention d'écrire est une cdcommande avec redirection de stderr et stdout vers / dev / null. Il y a deux façons de procéder.

Le plus simple dans votre cas serait d'informer simplement le shell que vous souhaitez la redirection, en ajoutant un >caractère. C'est ce que propose @erewok.

cd - 2>&1 >/dev/null

Cela redirige d'abord stderr (descripteur de fichier 2) vers le descripteur de fichier 1 (stdout), puis redirige stdout (implicite 1) vers / dev / null. Notez que la commande est importante; vous n'obtiendrez pas le même résultat si vous inversez les redirections, bien que dans certains cas, cela puisse apparaître en raison de la façon dont le programme particulier utilise les flux de sortie respectifs.

Alternativement, comme l'a suggéré @demure , vous pouvez utiliser &>pour rediriger les deux flux à la fois si cette syntaxe est prise en charge par votre shell.

cd - &>/dev/null

Notez que l'une de ces alternatives réduira également le silence à l'erreur lorsqu'elle $OLDPWDn'existe plus, car vous redirigez la sortie d'erreur standard dans le trou noir du système. Si c'est un problème, je vérifierai $?après; vous devez le confirmer vous-même si c'est vraiment un problème, mais au moins dans mes tests, un échec cd(que ce cd $someplacesoit cd -) se déclenche $? = 1après le succès $? = 0.

un CVn
la source
5

Vous pouvez peut-être utiliser

cd $OLDPWD

mais dans ce cas, vous aurez besoin de plus de frappe :)

Mais vous aurez un avantage: s'il y a une erreur, le message ne sera pas redirigé vers / dev / null.

Uzsolt
la source
1
Si elle $OLDPWDn'est pas définie, cela vous déposera ~. cd -affichera une erreur (et vous laissera probablement là où vous étiez déjà).
un CVn
1
Tu n'as pas raison. Si $ OLDPWD n'est pas défini (pourquoi? Peut-être que l'utilisateur peut le supprimer), le 'cd -' a le même résultat que "cd $ OLDPWD". Consultez la page de manuel ('cd -' est équivalent à 'cd "$ OLDPWD" && pwd'). Ou vous pouvez le tester :) 'OLDPWD = ""; cd - '- voyez que vous tomberez dans ~ et imprimerez un caractère ~.
uzsolt
1
Je viens de le tester. Sur mon système, la séquence cd /tmp bash cd -dit bash: cd: OLDPWD not setau deuxième cd; tandis que la séquence cd /tmp bash cd $OLDPWDvous place dans ~ (presque certainement parce que $ OLDPWD se développe en une chaîne vide). cd $OLDPWDfonctionnera bien une fois que vous en aurez fait au moins une cddans le shell en question, mais pas avant.
un CVn
Hm, oui, vous avez raison. J'ai testé avec zsh et avec zsh ne laisse pas tomber le message d'erreur.
uzsolt
1

Rediriger stdout et stderr: cd - &>/dev/null

la &>version est la version courte de la main cd - 2>/dev/null 1>&2, que je ce que je pense que vous vouliez dire à utiliser ...

  • Remarque &>nécessite bash> = 4.0.

Ps. la plupart des commandes peuvent être pointées vers des emplacements, il est donc peu probable que vous ayez réellement besoin decd

sage
la source
0

Vous pouvez utiliser:

cd ~-

Selon la page de manuel bash sous Tilde Expansion:

Si le préfixe tilde est un `~ - ', la valeur de la variable shell OLDPWD, si elle est définie, est substituée.

Dru
la source