bash - как да препратя резултата от командата which към cd

Как мога да препратя резултата от команда which към cd?

Ето какво се опитвам да направя:

which oracle | cd
cd < which oracle

Но никой от тях не работи.

Има ли начин да се постигне това (вместо копиране/поставяне разбира се)?

Редактиране: като се замисля, тази команда ще се провали, защото целевият файл НЕ е папка/директория.

Така че мисля и разработвам по-добър начин да се отърва от крайната част "/oracle" сега (sed или awk, или дори Perl) :)

Редактиране: Добре, това е, което имам в крайна сметка:

cd `which oracle | sed 's/\/oracle//g'`

person Michael Mao    schedule 09.08.2010    source източник
comment
което ви дава команда, а не директория   -  person Anycorn    schedule 09.08.2010
comment
опитвате ли се да получите директория, където е инсталирана програмата? _12_?   -  person Anycorn    schedule 09.08.2010
comment
@aaa : прав си, мисля, че dirname е по-добро, защото сочи към истинския dir, а не към символна връзка към изпълнимия файл на oracle... поради което моят sed подход ще се провали :)   -  person Michael Mao    schedule 09.08.2010


Отговори (7)


Използвате тръба в случаите, когато командата очаква параметри от стандартния вход. ( Още за това).

С командата cd това не е така. Директорията е аргументът на командата. В такъв случай можете да използвате заместване на команда. Използвайте обратни точки или $(...), за да оцените командата, запазете я в променлива..

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

въпреки че може да се направи по много по-прост начин:

cd `which oracle` 

или ако вашият път има специални знаци

cd "`which oracle`"

or

cd $(which oracle)

което е еквивалентно на нотация с обратна отметка, но е препоръчително (обратната отметка може да бъде объркана с апостроф)

.. но изглежда, че искате:

cd $(dirname $(which oracle))

(което ви показва, че можете лесно да използвате влагане)

$(...) (както и обратните означения) работят и в низове с двойни кавички, което помага, когато резултатът евентуално може да съдържа интервали.

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

(Имайте предвид, че и двата резултата изискват набор от двойни кавички.)

person mykhal    schedule 09.08.2010
comment
Готино. Бихте ли обяснили малко какво се случва тук? Това изглежда като дереференция на променлива; има ли някаква временна променлива по подразбиране, където отиват резултатите от дадена команда? - person Nate W.; 09.08.2010
comment
Аааа, напълно забравих за обратните точки :( - person Michael Mao; 09.08.2010
comment
Имате нужда от друга двойка кавички: cd "$(dirname "$(which oracle)")". - person Philipp; 09.08.2010
comment
| отваря нов процес, така че дори ако cd прочете от STDIN, cmd | cd няма да работи (т.е. текущата директория в оригиналния процес ще остане същата). - person Kyle Strand; 03.04.2014

С dirname за получаване на директорията:

cd $(which oracle | xargs dirname)

РЕДАКТИРАНЕ: пазете се от пътища, съдържащи интервали, вижте коментара на @anishpatel по-долу

person Community    schedule 09.08.2010
comment
Използвайте cd "$(which oracle | xargs -0 dirname)", ако пътят може да съдържа интервал. Флагът -0 разделя входа на нула, а не на интервал. - person anishpatel; 05.05.2017

cd `which oracle`

Имайте предвид, че това са обратни точки (обикновено клавишът отляво на 1 на американска клавиатура)

person Cfreak    schedule 09.08.2010
comment
Това не работи, ако пътят съдържа интервали или други специални знаци и трябва да премахнете името на файла. - person Philipp; 09.08.2010
comment
@Philipp можете да използвате това, ако пътят ви има специални знаци cd "`which oracle`" - person Ram Patra; 09.07.2016

Добре, ето решение, което използва правилно цитиране:

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

Избягвайте обратни отметки, те са по-малко четими и винаги цитирайте замествания на процеси.

person Philipp    schedule 09.08.2010

Нямате нужда от тръба, можете да правите каквото искате, като използвате разширението на параметрите на Bash!

Допълнителен съвет: използвайте "type -P" вместо външната команда "which", ако използвате 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
person bashfu    schedule 09.08.2010

В отговор на вашия редактиран въпрос можете да премахнете името на командата, като използвате dirname:

cd $(dirname `which oracle`)
person David Z    schedule 09.08.2010
comment
Това не работи, ако пътят съдържа интервали или други специални знаци. - person Philipp; 09.08.2010
comment
Лесно се коригира чрез двойни кавички. - person David Z; 09.08.2010

освен добрия отговор по-горе, едно нещо трябва да се спомене е, че cd е вградена обвивка, която се изпълнява в същия процес, различен от нов процес като ls, който е команда.

  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

person Jiacai Liu    schedule 24.08.2014