Comment puis-je diriger le résultat d'une which
commande vers cd
?
C'est ce que j'essaye de faire:
which oracle | cd
cd < which oracle
Mais aucun d'entre eux ne fonctionne.
Existe-t-il un moyen d'y parvenir (plutôt que de copier / coller bien sûr)?
Edit: après réflexion, cette commande échouerait, car le fichier de destination n'est PAS un dossier / répertoire .
Je suis donc en train de réfléchir et de trouver un meilleur moyen de me débarrasser de la partie "/ oracle" de fin 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'`
dirname
,basename
?Réponses:
Vous utilisez un tube dans les cas où la commande attend des paramètres de l'entrée standard. ( Plus à ce sujet ).
Avec
cd
commande ce n'est pas le cas. Le répertoire est l'argument de la commande. Dans ce cas, vous pouvez utiliser la substitution de commande. Utilisez des backticks ou$(...)
pour évaluer la commande, stockez-la dans une variable.path=`which oracle` echo $path # just for debug cd $path
bien que cela puisse être fait d'une manière beaucoup plus simple:
cd `which oracle`
ou si votre chemin contient 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 des apostrophes)
.. mais il semble que vous vouliez:
cd $(dirname $(which oracle))
(ce qui vous montre que vous pouvez utiliser l'imbrication facilement)
$(...)
(ainsi que les backticks) fonctionnent également dans les chaînes entre guillemets, ce qui est utile 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.)
la source
cd "$(dirname "$(which oracle)")"
.|
ouvre un nouveau processus, donc même s'il estcd
lu à partir de STDIN,cmd | cd
ne fonctionnerait pas (c'est-à-dire que le répertoire actuel dans le processus d'origine resterait le même).Avec dirname pour obtenir le répertoire:
cd $(which oracle | xargs dirname)
EDIT: attention aux chemins contenant des espaces, voir le commentaire @anishpatel ci-dessous
la source
cd "$(which oracle | xargs -0 dirname)"
si le chemin peut contenir des espaces. L'indicateur -0 divise l'entrée par null plutôt que par des espaces.cd `which oracle`
Notez que ce sont des backticks (généralement la touche à gauche de 1 sur un clavier américain)
la source
cd "`which oracle`"
OK, voici une solution qui utilise des citations correctes:
cd "$(dirname "$(which oracle)")"
Évitez les backticks, ils sont moins lisibles et citez toujours les substitutions de processus.
la source
Vous n'avez pas besoin d'un tube, vous pouvez faire ce que vous voulez en utilisant l'expansion des paramètres Bash!
Astuce 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
la source
En réponse à votre question modifiée, vous pouvez supprimer le nom de la commande en utilisant
dirname
:cd $(dirname `which oracle`)
la source
en plus de la bonne réponse ci-dessus, une chose doit être mentionnée est que cd est un shell intégré, qui s'exécute dans le même processus autre qu'un nouveau processus comme ls qui est une commande.
/unix/50022/why-cant-i-redirect-a-path-name-output-from-one-command-to-cd
http://en.wikipedia.org/wiki/Shell_builtin
la source