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'`
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.)
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
cd `which Oracle`
Notez que ce sont des backticks (généralement la touche à gauche de 1 sur un clavier américain)
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.
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
En réponse à votre question modifiée, vous pouvez supprimer le nom de la commande à l'aide de dirname
:
cd $(dirname `which Oracle`)
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.