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'`
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.)
cd `which oracle`
notez qu'il s'agit de backticks (généralement la touche à gauche de 1 sur un clavier américain)
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.
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
en réponse à votre question modifiée, vous pouvez supprimer le nom de la commande en utilisant dirname
:
cd $(dirname `which oracle`)
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.