web-dev-qa-db-fra.com

bash - comment diriger le résultat de la commande which vers cd

Comment puis-je diriger le résultat d'une commande which vers cd?

Voici ce que j'essaie de faire:

which Oracle | cd
cd < which Oracle

Mais aucun ne fonctionne.

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

Edit: à la réflexion, cette commande échouerait, car le fichier de destination n'est PAS un dossier/répertoire.

Je pense donc et je travaille sur une meilleure façon de se débarrasser de la partie "/ Oracle" de fin maintenant (sed ou awk, ou même Perl) :)

Edit: D'accord, c'est ce que j'ai à la fin:

cd `which Oracle | sed 's/\/Oracle//g'`
74
Michael Mao

Vous utilisez le canal dans les cas où la commande attend des paramètres de l'entrée standard. ( En savoir plus ).

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 commandes. Utilisez des backticks ou $(...) pour évaluer la commande, stockez-la dans la variable ..

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

bien que cela puisse être fait de 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 équivaut à la notation backtick, mais est recommandé (les backticks peuvent être confondus avec les apostrophes)

.. mais on dirait que vous voulez:

cd $(dirname $(which Oracle))

(ce qui vous montre que vous pouvez facilement utiliser l'imbrication)

$(...) (ainsi que les backticks) fonctionnent également dans les chaînes entre guillemets doubles, ce qui aide 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.)

105
mykhal

Avec dirname pour obtenir le répertoire:

cd $(which Oracle | xargs dirname)

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

22
user180100
cd `which Oracle`

Notez que ce sont des backticks (généralement la touche à gauche de 1 sur un clavier américain)

9
Cfreak

OK, voici une solution qui utilise des citations correctes:

cd "$(dirname "$(which Oracle)")"

Évitez les retours en arrière, ils sont moins lisibles et citez toujours les substitutions de processus.

4
Philipp

Vous n'avez pas besoin d'un tuyau, vous pouvez faire ce que vous voulez en utilisant l'expansion des paramètres Bash!

Autre conseil: 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
bashfu

En réponse à votre question modifiée, vous pouvez supprimer le nom de la commande à l'aide de dirname:

cd $(dirname `which Oracle`)
1
David Z

en plus de la bonne réponse ci-dessus, une chose doit mentionner est que cd est un shell intégré, qui s'exécute dans le même processus 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
Jiacai Liu