bash - comment pipe résultat de la commande cd

Comment faire passer le résultat d'une commande which à cd ?

C'est ce que j'essaie de faire:

which oracle | cd
cd < which oracle

mais aucun d'eux ne fonctionne.

y a-t-il un moyen d'y parvenir (plutôt que copier/coller bien sûr)?

Edit : après réflexion, cette commande échouerait, parce que le fichier de destination n'est pas un dossier/répertoire .

Donc, je pense et je travaille sur une meilleure façon de se débarrasser de la suite "/oracle" maintenant (sed ou awk, ou même Perl):)

Edit : OK c'est ce que j'ai à la fin:

cd `which oracle | sed 's//oracle//g'`
68
demandé sur ROMANIA_engineer 2010-08-09 09:23:07

7 réponses

vous utilisez pipe dans les cas où la commande attend des paramètres à partir de l'entrée standard. ( plus sur ce ).

avec la commande cd ce n'est pas le cas. Le répertoire est l'argument de commande. Dans ce cas, vous pouvez utiliser la substitution de commande. Utilisez des bâtons arrière ou $(...) pour évaluer la commande, stockez-la dans la variable..

path=`which oracle`
echo $path # just for debug
cd $path

bien qu'il puisse être fait d'une manière beaucoup plus simple:

cd `which oracle` 

ou si votre chemin a des caractères spéciaux

cd "`which oracle`"

ou

cd $(which oracle)

, ce qui est équivalent à une notation rétrograde, mais est recommandé (les rétrogrades peuvent être confondues avec des apostrophes)

.. mais il semble que vous voulez:

cd $(dirname $(which oracle))

(qui vous montre que vous pouvez utiliser la nidification facilement)

$(...) les chaînes à guillemets doubles, qui aident lorsque le résultat peut éventuellement contenir des espaces..

cd "$(dirname "$(which oracle)")"

(notez que les deux sorties nécessitent un ensemble de guillemets doubles.)

91
répondu mykhal 2017-05-04 21:26:56

avec dirname pour obtenir le répertoire:

cd $(which oracle | xargs dirname)

EDIT: méfiez - vous des chemins contenant des espaces, voir le commentaire de @anishpatel ci-dessous

20
répondu 2017-05-05 05:33:05
cd `which oracle`

notez qu'il s'agit de backticks (généralement la touche à gauche de 1 sur un clavier américain)

8
répondu Cfreak 2010-08-09 05:25:42

OK, voici une solution qui utilise une citation correcte:

cd "$(dirname "$(which oracle)")"

Evitez les rétrogrades, elles sont moins lisibles, et citez toujours les substitutions de processus.

3
répondu Philipp 2010-08-09 11:07:39

vous n'avez pas besoin d'une pipe, vous pouvez faire ce que vous voulez en utilisant L'extension des paramètres de Bash!

conseil supplémentaire: utilisez" type-P "au lieu de la commande externe" which " si vous utilisez Bash.

# test
touch /ls
chmod +x /ls
cmd='ls'
PATH=/:$PATH
if cmdpath="$(type -P "$cmd")" && cmdpath="${cmdpath%/*}" ; then
   cd "${cmdpath:-/}" || { echo "Could not cd to: ${cmdpath:-/}"; exit 1; }
else
   echo "No such program in PATH search directories: ${cmd}"
   exit 1
fi
2
répondu bashfu 2010-08-09 10:56:01

en réponse à votre question modifiée, vous pouvez supprimer le nom de la commande en utilisant dirname :

cd $(dirname `which oracle`)
1
répondu David Z 2010-08-09 05:37:56

en plus de la bonne réponse ci-dessus, une chose doit être mentionnée est que cd est un builtin de shell, qui tourne dans le même processus autre que le nouveau processus comme ls qui est une commande.

  1. https://unix.stackexchange.com/questions/50022/why-cant-i-redirect-a-path-name-output-from-one-command-to-cd

  2. http://en.wikipedia.org/wiki/Shell_builtin

0
répondu Jiacai Liu 2017-04-13 12:36:27